异步函数与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秒,而且运行过程系统卡死,不能进行任何操作,这就是异步执行重负荷代码的好处。


本页地址:http://www.foxtable.com/mobilehelp/topics/3274.htm