插入同步代码

我们用专门的异步对话框解决了在异步函数中使用对话框的问题,用新增的OpenAsync函数解决了在异步函数中使用窗口的问题。

但Foxtable是可以扩展的,可能会使用第三方的UI,而且Foxtable自己的UI也不仅限于对话框和用户窗口。

此外除了UI,写入数据的代码最好也不要异步执行,因为如果多个线程同时向一个DataTable写入数据,很可能会导致数据表被损坏。

终极的解决方法是在异步函数中插入同步代码,方法很简单:

'异步代码
BaseMainForm.Invoke(
Sub()
   
'需要同步执行的UI代码
   
'需要同步执行的数据写入代码
End
Sub)
'异步代码

示例

增加一个函数AddRowsAsync,代码为:

'''Async
Await
Task.Delay(2000) '模拟需要执行2秒的异步代码
BaseMainForm.Invoke(
Sub()
   
Dim cnt As Integer = 1
   
'InputValue会显示一个窗口,如果不包装在同步代码中,很容易出问题:
   
If InputValue(cnt, "增加行", "请输入要增加的行数") Then
       
If cnt > 0 Then
            Tables(
"员工").AddNew(cnt)
            Forms(
"独立窗口").Open() '因为已经包装在同步代码中,所以不用OpenAsync,直接用Open打开 也可以
       
End If
   
End If
End
Sub)
Await
Task.Delay(1000) '模拟需要执行1秒的异步代码

然后在命令窗口测试:

Functions.ExecuteAsync("AddRowsAsync")

等待两秒后会出现对话框,输入要增加的行数,单击确定按钮增加行,整个过程不会有任何问题。

重要提示:

异步编程至此已经讲完了,需要强调的是:不规范的异步编程不一定会马上出问题,只是出问题的概率很大,而且即使今天不出问题,明天也可能出问题,即使这台电脑没问题,换台电脑也可能有问题,所以一开始就必须严守规范。


本页地址:http://www.foxtable.com/webhelp/topics/6369.htm