微信号:infoqchina

介绍:有内容的技术社区媒体

C#中的异步陷阱

2013-05-07 16:21 InfoQ

有时候,理解一种语言中的缺陷的最好方式是查看另一种语言如何防止这些缺陷发生。《Real-World Functional Programming》的作者Tomas Petricek讨论了异步C#代码中常见的7项错误,并说明F#如何降低这些缺陷出现的可能性。


这7项常见错误包括:


Async没有异步运行:只有在第一个await语句之后出现的代码才会异步运行。


忽略结果:忘记await一个函数返回的任务,将会导致乱序执行。


Async void方法:不能await一个返回“async void”而不是“async Task”的异步函数,这会导致与上一条相同的问题。


Async void lambda函数:发生在当某个函数接收一个Action委托而不是Func<…,Task>委托的时候。此外也无法await一个async函数。


嵌套任务:在语句“await Task.Factory.StartNew(async () => { await Task.Delay(1000); });”中,第一个和第二个await语句互相之间完全无关。这意味着第一个await将在第二个await之前完成,而语句中关联的1000ms延迟将被忽略。


未按异步方式运行:使用Task.Wait()会将整个调用栈强制转为同步模式。


F#中的async工作流并不是基于Task和Task<T>类型,而是使用自己的类型——Async<T>。


点击“阅读原文”查看更多内容并吐槽吧。

 
InfoQ 更多文章 Facebook如何实现PB级别数据库自动化备份 学术派Google软件工程师Matt Welsh谈移动开发趋势 Spotify为什么要使用一些“无聊”的技术? 妹纸们放假了,汉纸们做啥? 大多数重构可以避免
猜您喜欢 夺命U盘2.0版本到来,一插电脑就完蛋! Web页面测试——控件类(二) 来来来,咱们再讲几个关于招人和面试的段子 独立开发者面临危机? 从5个角度反驳这一伪命题 HTML5 拖放实例