单线程异步编程,是最简单也应用最广泛的异步编程形式,一般是注册个回调函数或同步事件,然后将线程处于idle状态(比如调用GetMessage/SleepEx/MsgWaitForSingleObject等),由系统在idle状态调用回调函数或触发同步事件,使得程序继续运行。使用这种异步形式需要考虑的问题最少,只需要注意,一是代码执行时间不要过长,二是回调函数触发顺序不能预测。由于函数触发顺序不能预测,所以要注意状态的传递问题。语言的闭包特性可以使得程序状态被继承,大大简化了异步编程。
多线程异步编程,一般是注册个回调函数,然后由系统直接创建新线程执行。比如.NET中的XXXXXXXXXreading.Timer。使用这种异步形式,不用担心代码执行时间过长的问题,但要考虑访问公共资源的同步问题,不然程序可能会出现错误结果甚至崩溃。这种异步形式对于系统资源的消耗也是比较大的。
中断是另一种异步编程,中断可以在非idle状态触发,并插入尚未执行完的程序中执行。中断异步编程最麻烦,除了上面所说的问题之外,还要考虑状态保护问题,不然正在执行的程序容易跑飞,甚至导致系统崩溃。大多数现代操作系统都将中断机制封装在ring0层,不允许ring3程序挂钩中断。
在JavaScript中异步编程应用非常广泛,是历史中长期没有多线程支持造成的。