主线程和子线程
在Foxtable中,所有代码,包括Foxtable自身的代码,以及用户进行二次开发所编写的代码,默认都在同一个线程中运行,这个线程称为主线程。
UI(用户界面)的显示和刷新,以及对用户操作的响应(例如用户单击某个按钮,选择某个单元格),也都是在主线程中完成的,所以如果主线程经常处于长时间大负荷的运算中,那么用户会感觉程序有明显的卡顿甚至假死。
对于并发访问量比较大的服务端程序,如果所有访问请求都在主线程中处理,UI将经常无法响应(当然对于服务端程序,这并不重要),更重要的是单个用户的等候时间也会延长甚至出现超时错误,影响用户感受。
我们可以在主线程之外,另外开启一些线程,用于处理每个用户的访问请求,这种称之为子线程。
开启子线程
Foxtable用异步函数开启子线程,例如采用异步函数编程的服务端程序,其运行过程如下图:
上图中蓝色为主线程,黄色为子线程,可以看到由于每次收到新的用户访问请求后,都会调用异步函数,新开一个线程专门用于处理此用户的访问,所以主线程始终不会被阻塞,可以随时接入新的访问请求。
返回主线程
在主线程中创建的类,例如DataTable、Table、窗口和菜单等等,都不允许在子线程中访问。
如果收到用户访问请求之后,只是直接读写后台数据,然后将处理结果发送给用户,那么没有问题,而且Foxtable增强了SQLCommand之后,处理后台数据也更加方便了。
但是确实有时候,子线程需要调用上述对象,例如我们需要在服务端的主界面动态显示在线用户。
还有一种情况,我们开启了多个线程分别负责一部分数据运算工作,完成后需要将计算结果返回给主线程统一处理。
上述情况要求我们必须提供从子线程返回主线程的功能。
子线程通过调用同步函数返回主线程,下面是另一个服务端程序,子线程处理完毕后,通过调用同步函数回到主线程,其运行过程如下图:
图中蓝色为主线程,黄色为子线程,同样主线程不会因为有用户访问而处于阻塞状态,不同的是子线程执行完毕后,调用同步函数返回到主线程继续执行部分代码。
不管是异步函数还是同步函数,都可以传递参数,所以主线程和子线程之间可以相互传递数据。
子线程并非只能执行完毕后才能调用同步函数,实际上子线程运行过程中,可以随时调用同步函数返回主线程执行,等同步函数在主线程执行完毕后(也可以不等待),继续执行子线程中的后续代码,且调用同步函数的次数不限。
真的很简单
综上所述,在Foxtable进行异步编程非常的简单:
1、主线程调用异步函数开启一个子线程执行需要异步执行的代码。
2、子线程调用同步函数返回主线程执行需要同步执行的代码。