Net 4.5的 异步-等待模式正在改变范式,它好得令人难以置信。
我一直在将一些 IO 代码移植到异步等待中,因为阻塞已经是过去的事情了。
相当多的人将异步-等待比作僵尸入侵,我发现它相当准确。异步代码与其他异步代码类似(您需要一个异步函数来等待一个异步函数)。因此,越来越多的函数变得异步,并且这在代码库中不断增长。
将函数更改为异步有些重复和缺乏想象力的工作。在声明中抛出一个 async
关键字,用 Task<>
包装返回值,这样就差不多完成了。整个过程是如此的简单,这让人很不安,很快一个文本替换脚本就会自动为我实现大部分的“移植”。
现在问题来了。.如果我所有的代码都在慢慢地变成异步的,为什么不在默认情况下把它们都变成异步的呢?
我认为最明显的原因是性能。异步-等待有它的开销和代码,不需要是异步的,最好不应该。但是,如果性能是唯一的问题,那么一些聪明的优化肯定可以在不需要时自动消除开销。我已经阅读了关于 "fast path"优化的文章,在我看来,只有它才能解决大部分问题。
也许这与垃圾收集器带来的范式转变类似。在早期的 GC 时代,释放您自己的内存肯定更有效。但是大多数人仍然选择自动收集,而倾向于更安全、更简单的代码,因为它们的效率可能更低(甚至可以说这种情况已经不再正确)。也许应该这样?为什么所有的函数不应该是异步的?