异步
讲一个概念,异步跟多线程,就像巴基斯坦和卡巴斯基,有鸡巴关系
为什么要用异步方法?
没有人喜欢线程被阻塞,尤其发出IO操作的时候,
异步操作是强大的,它是许多高吞吐量,快响应时间架构的基石。
为什么异步很难
首先异步很难,异步代码,有大量的状态操作,比方说鼠标拖拽功能,你就需要维护很多中间状态.
异步操作之间组合,交互,取消等操作很难实现,
异步代码会破坏"代码局部性"从而让代码可读性非常差.(想想js中的回调噩梦)而且也很难一个Try/catch 统一异常处理
怎么异步?
-
基于回调
这是传统的异步模型,最常用的方法,早期版本的C# 的Begin/End异步或者基于事件的异步模型.或者js里面的ajax,
但是,这种编程模型很糟糕,首先,破坏了代码的局部性,写起来非常麻烦,更不用说异步组合,异常处理,取消,等操作. -
基于迭代器
有了迭代生成器,我们就可以在发起异步操作的时候,将控制权交给外部,由外部来决定代码什么时候继续执行,
这就在一定程度上保持了代码的局部性。 -
基于框架
比如Reactive Extensions,使用别人已经抽象好的异步模型,这样就可以不用管异步细节,框架已经封装好了一切.
-
基于语言特性
比如C# 5 的Async Await,虽然本质上,是一种回调,但是,微软已经封装好了异步模型,你可以很圆润的将异步代码写在一个方法里.
异步与多线程
本来不想比较的,后来想想还是放一起了.
线程的本质,是操作系统提供的一种逻辑功能,是进程中并发运行的的代码.
而异步,是通过上面写的几种手段,让主线程不等待.当然,异步代码背后可能也有多线程任务在跑.
换种说法,异步是目的,多线程,是手段.
网友评论