商业网站建设费用抖音搜索排名
VSTO 开发 EXCEL 委托与多线程的极简示例
- 问题
- 解决
- 步骤
- 代码
问题
这几天做 excel 加载项时遇到一个问题,对话框弹窗显示后,需要等待网络数据的返回来填充 ListBox 控件,由于网络延迟问题,整个窗体连带 Excel 一起白屏卡顿 5-10秒,体验感极差。
解决
这个问题其实在网络编程中是最常见的,通常都是采用 post 异步操作。于是我在 vb 中引用了 Task 异步载入数据,但问题依旧。查阅资料后原来是 vb.net 异步是单线程的,IO 繁忙阻塞了后续代码的执行。在 郑广学 老师的指点下,采用 vb 委托回调的概念,果然解决了这个痛点。
步骤
- 打开 Visual Studio 2017/2019/2021
- 创建一个 Excel VSTO 外接程序的新项目
- 添加一个 功能区(可视化设计器),编译器创建 Ribbon1.vb
- 点击工具面板增加一个按钮
- 添加一个 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