当前位置: 首页 > news >正文

VSTO 开发 EXCEL 委托与多线程的极简示例

VSTO 开发 EXCEL 委托与多线程的极简示例

  • 问题
  • 解决
  • 步骤
  • 代码

问题

这几天做 excel 加载项时遇到一个问题,对话框弹窗显示后,需要等待网络数据的返回来填充 ListBox 控件,由于网络延迟问题,整个窗体连带 Excel 一起白屏卡顿 5-10秒,体验感极差。

解决

这个问题其实在网络编程中是最常见的,通常都是采用 post 异步操作。于是我在 vb 中引用了 Task 异步载入数据,但问题依旧。查阅资料后原来是 vb.net 异步是单线程的,IO 繁忙阻塞了后续代码的执行。在 郑广学 老师的指点下,采用 vb 委托回调的概念,果然解决了这个痛点。

步骤

  1. 打开 Visual Studio 2017/2019/2021
  2. 创建一个 Excel VSTO 外接程序的新项目
  3. 添加一个 功能区(可视化设计器),编译器创建 Ribbon1.vb
  4. 点击工具面板增加一个按钮
  5. 添加一个 Windows 窗体,在窗体里添加 RichText 控件

代码

代码文件 Ribbon1.vb,设置按钮弹窗响应

Imports Microsoft.Office.Tools.Ribbon
Public Class Ribbon1Private Sub Button1_Click(sender As Object, e As RibbonControlEventArgs) Handles Button1.ClickDim DW As New Form1DW.Show()End Sub
End Class

代码文件 Form1.vb, 声明委托、多线程、回调

Public Class Form1Public Delegate Sub UpdateText(ByVal txt As String)     '定义一个空委托,只有名字和参数Private LoadText As UpdateText              '声明一个委托类型变量Private Sub TextSet(ByVal txt As String)    '定义函数,将参数 txt 存入 RichText 控件中Me.RichTextBox1.Text = txtEnd SubPrivate Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.LoadLoadText = AddressOf TextSet    '当函数载入内存后,将其指针存到变量 LoadTextDim thread As New Threading.Thread(         '创建第二线程并载入匿名函数Sub()Threading.Thread.Sleep(5000)        '模拟网络延迟 5 秒Dim res As String = "来自 Web 的问候"     '读到网络数据Me.Invoke(LoadText, res)            '在第二线程中执行回调函数End Sub)thread.Start()RichTextBox1.Text = "数据载入中,请稍候..."End SubEnd Class
http://www.lryc.cn/news/13028.html

相关文章:

  • spring之使用Spring的AOP
  • LeetCode LCP 66. 最小展台数量
  • 设计模式之模板方法模式
  • Python数据挖掘基础
  • Go基础-函数
  • AC的改进算法——TRPO、PPO
  • 【C++学习】list的使用及模拟实现
  • 动态规划专题精讲1
  • PPO(proximal policy optimization)算法
  • ElasticSearch基本使用
  • windows微软商店下载应用失败/下载故障的解决办法;如何在网页上下载微软商店的应用
  • MySQL进阶篇之InnoDB存储引擎
  • 商标侵权行为的种类有哪些
  • Similarity-Preserving KD(ICCV 2019)原理与代码解析
  • 在Linux和Windows上安装seata-1.6.0
  • 兼职任务平台收集(二)分享给有需要的朋友们
  • 目标检测三大数据格式VOC,YOLO,COCO的详细介绍
  • SpringBoot实现统一返回接口(除AOP)
  • ChatGpt - 基于人工智能检索进行论文写作
  • 实例三:MATLAB APP design-多项式函数拟合
  • springboot多种方式注入bean获取Bean
  • Markdown及其语法详细介绍(全面)
  • 在Linux和Windows上安装sentinel-1.8.5
  • 面试攻略,Java 基础面试 100 问(十)
  • Zero-shot(零次学习)简介
  • 51单片机简易电阻电感电容RLC测量仪仿真设计
  • [软件工程导论(第六版)]第6章 详细设计(课后习题详解)
  • 【2.19】算法题2:贪心算法、动态规划、分治
  • 【Redis】Redis 发布订阅通信模式 ( 发布订阅模式 | 订阅频道 | 发布消息 | 接收消息 )
  • VNCTF 2023复现