异步函数与UI
我们建议尽量不要在异步函数中有和UI相关的代码,否则很容易产生错误。
如果要在异步函数更新UI,应该定义一个函数用于更新UI,然后在异步函数同步调用之。
本节的例子和上一节类似,只是希望在状态栏上显示进度条,关注状态栏,请参考:状态栏
1、定义Public变量
首先我们在全局代码中定义一个Public变量:
Public Total As Integer
2、定义同步函数
定义一个名为AddTotal的函数,其代码为:
Total
= Total + args(0)
StatusBar.ProgressBar.Value
= StatusBar.ProgressBar.Value
+ 1
StatusBar.Message2
= Total
If
StatusBar.ProgressBar.Value
= 100
'如果运行了100次,表示全部子线程运行完毕
MessageBox.show("运行完毕,累计结果是:"
& Total,
"提示",
MessageBoxButtons.OK
,MessageBoxIcon.Information)
End
If
这个函数将在异步函数中被同步调用,用于累加各异步函数产生的结果,在状态栏显示最新结果,并更新进度条。
3、定义异步函数
然后定义一个名为AddSubtotal的函数,这个函数将在主线程中被异步调用,其代码为:
Dim
Sum As
Integer
For i
As Integer
= 1 To
100
Sum
= Sum +
1
Next
Sleep(1000)
'暂停子线程1秒,模拟耗时的操作
Functions.BeginSyncExecute("AddTotal",Sum)
'同步调用函数AddTotal
4、测试结果
然后在命令窗口执行代码:
Total =
0
StatusBar.ProgressBar.Visible
= True
StatusBar.ProgressBar.Value
= 0
For i
As Integer
= 1 To 100
Functions.AsyncExecute("AddSubtotal")
Next
执行的过程,会在状态栏显示进度以及Total的当前值:
在我的电脑测试,上述代码用时3秒多完成所有计算,而且运行过程可以继续进行其他操作,不受影响。
我们可以测试一下,不用异步函数执行,将AsyncExecute改为Execute:
Total
= 0
StatusBar.ProgressBar.Visible
= True
StatusBar.ProgressBar.Value
= 0
For i
As Integer
= 1 To 100
Functions.Execute("AddSubtotal")
Next
用时超过100秒,而且运行过程系统卡死,不能进行任何操作,这就是异步执行重负荷代码的好处。