GTLC全球技术领导力峰会·上海站,首批讲师正式上线! 了解详情
写点什么

C#中的异步陷阱

2013 年 5 月 06 日

有时候,理解一种语言中的缺陷的最好方式是查看另一种语言如何防止这些缺陷发生。《Real-World Functional Programming》(注:该书已由清华大学出版社引进,中文名《C#与 F#编程实践》)的作者 Tomas Petricek 讨论了异步 C#代码中常见的 7 项错误,并说明 F#如何降低这些缺陷出现的可能性。

以下是 Tomas 的文章《在C#和F#中使用异步:C#中的异步陷阱》所覆盖内容的简要介绍,而我们更鼓励读者阅读整篇文章。

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#的开发者来说,在了解到 F#中的 async 工作流并不是基于 Task 和 Task类型的时候或许会感到惊讶。相反,F#使用自己的类型——Async

查看英文原文: Asynchronous Gotchas in C#


感谢姚琪琳对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ )或者腾讯微博( @InfoQ )关注我们,并与我们的编辑和其他读者朋友交流。

2013 年 5 月 06 日 07:182672
用户头像

发布了 256 篇内容, 共 50.5 次阅读, 收获喜欢 4 次。

关注

评论

发布
暂无评论
发现更多内容

区块链赋能数字产业转型

茜茜公主

3月日更

成为你向往的那只独角兽 - 《独角兽项目》出版在即

京东科技开发者

DevOps

RPA助力证券行业高质量发展

Jason Tien

RPA 金融科技 证券 云原生微服务 自动化平台

Webpack 基石 tapable 揭秘

vivo互联网技术

前端 webpack 流程管理 tapable

密码学系列之:内容嗅探

程序那些事

加密解密 密码学 程序那些事 内容嗅探

带你轻松理解数据结构之Map

蛙人

JavaScript 前端

uni-app 和 flutter 的区别

anyRTC开发者

flutter uni-app WebRTC 跨平台

重点人员动态管控系统开发,智慧警务系统建设解决方案

WX13823153201

重点人员动态管控系统开发

波场环球系统开发|波场环球软件APP开发

开發I852946OIIO

系统开发

区块链赋能农产品溯源,农产品质量安全追溯

13530558032

阿里大牛亲码1222道Java岗面试真题!(2021全彩版)

程序员小毕

Java 程序员 架构 面试 分布式

翻云覆雨——前景理论之隔离效应

Justin

心理学 28天写作 游戏设计

二十张图让你一分钟全面学习数仓建设之路

初学大数据

大数据 数据仓库

Spring Boot工程结构

韩斌

Spring Boot

广告主营销策略的改变,为什么总离不开户外媒体?

󠀛Ferry

七日更 3月日更

正则表达式.05 - 匹配模式

insight

正则表达式 3月日更

DDR4看这一篇就够了

Kevin Z

《精通比特币》学习笔记(第六章)

棉花糖

区块链 学习笔记 3月日更

Markdown中的图标为什么不是图片却可以以图片方式显示

happlyfox

28天写作 3月日更

智慧公安情报研判系统开发,大数据可视化分析平台

13530558032

Elasticsearch 定制 Dynamic Mapping 策略

escray

elastic 28天写作 死磕Elasticsearch 60天通过Elastic认证考试 3月日更

Python 关键字

HoneyMoose

(28DW-S8-Day18) 可插拔式知识

mtfelix

28天写作

寻找被遗忘的勇气(十)

Changing Lin

3月日更

智慧组工党建系统-数字赋能组织工作

13530558032

算法攻关 - 重建二叉树 (O(n))_0105

小诚信驿站

刘晓成 小诚信驿站 28天写作 算法攻关 重建二叉树

熬夜重构了IDEA插件Toolkit(整合程序员常用的工具箱),更加便捷

Silently9527

Java idea插件 程序员工具、

垃圾代码和优质代码的区别?

xcbeyond

Java 优化代码 3月日更

手写的第一个 Java 应用程序,执行的时候发生了什么?

白色蜗牛

Java

一个PHPer的Golang之路

Kevin Wan

php golang 微服务

CloudQuery v1.3.4 版本更新

CloudQuery社区

oracle 运维 编辑器 sql 数据库管理工具

DNSPod与开源应用专场

DNSPod与开源应用专场

C#中的异步陷阱-InfoQ