异步函数与窗口
本节内容可参考示例文件"CaseStudy\异步函数.Table"。
上一节提到,因为异步函数无法处理UI,所以我们专门提供了6个异步对话框。
其实不止对话框,窗口也属于 UI 范畴,同样存在异步调用的问题。
新建一个函数OpenWindow,代码为:
Forms("独立窗口").Open()
然后在命令窗口异步执行这个函数:
Functions.ExecuteAsync("OpenWindow")
执行后,Foxtable可能会失去响应(界面卡死),甚至崩溃。具体表现可能因操作系统和窗口类型而异,但根本原因都是因为在非UI线程中直接操作了UI元素。
为解决上述问题,窗口增加了一个OpenAsync方法,专门用于在异步函数中打开窗口。
新建一个异步函数OpenWindowAsync,代码为:
'''Async
Forms("独立窗口").OpenAsync()
现在在命令窗口测试下面的代码,则一切正常:
Functions.ExecuteAsync("OpenWindowAsync")
如果希望窗口打开后才执行后续代码,可以加上Await,例如:
Await
Functions.ExecuteAsync("OpenWindowAsync")
'后续代码
如果你希望异步函数本身在打开窗口后才执行后续代码,可以将函数代码改为:
'''Async
Await
Forms("独立窗口").OpenAsync()
'后续代码
因为OpenAsync本就是异步函数,可以用Await等待。
最后如果要在异步函数中关闭窗口,必须用CloseAsync方法,例如:
Forms("独立窗口").CloseAsync()
总结
1、在异步函数中,用OpenAsync方法打开窗口
2、在异步函数中,用CloseAsync方法关闭窗口