插入同步代码
我们用专门的异步对话框解决了在异步函数中使用对话框的问题,用新增的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")
等待两秒后会出现对话框,输入要增加的行数,单击确定按钮增加行,整个过程不会有任何问题。
重要提示:
异步编程至此已经讲完了,需要强调的是:不规范的异步编程不一定会马上出问题,只是出问题的概率很大,而且即使今天不出问题,明天也可能出问题,即使这台电脑没问题,换台电脑也可能有问题,所以一开始就必须严守规范。