c# - 为什么这个 async/await 代码不会死锁
问题描述
我正在阅读这篇关于死锁的文章,我尝试使用自己的代码,但它没有死锁问题。这是为什么?
我期待:
GetJsonAsync
完成等待并即将返回jsonString
Main
正在执行jsonTask.Result
并保持上下文GetJsonAsync
想要返回jsonString
直到上下文可用会发生死锁
public static void Main(string[] args) { var jsonTask = GetJsonAsync(); int i = jsonTask.Result; Console.WriteLine(jsonTask.Result); } public static async Task<int> GetJsonAsync() { var jsonString = await ReturnIntAsync(); return jsonString; } public static async Task<int> ReturnIntAsync() { int i = 0; await Task.Run(() => i++); return i; }
解决方案
它不会死锁,因为没有同步SynchronizationContext
,所以该async
方法恢复在线程池线程上执行,而不是在主线程上执行。
文章中的相关引用(强调添加):
情况如下:从我的介绍文章中记住,在等待任务之后,当方法继续时,它将在上下文中继续。
在第一种情况下,此上下文是 UI 上下文(适用于除控制台应用程序之外的任何 UI )。在第二种情况下,此上下文是 ASP.NET 请求上下文...
对于 UI 示例,“上下文”是 UI 上下文;对于 ASP.NET 示例,“上下文”是 ASP.NET 请求上下文。任何一种“上下文”都可能导致这种类型的死锁。
如果你真的想以这种方式死锁一个控制台应用程序,你可以使用AsyncContext
我的AsyncEx
库在你的控制台应用程序的主线程上安装一个单线程上下文。
推荐阅读
- c# - 登录失败后将用户名传回 MVC 视图/文本框
- python - 使用 Python Selenium 访问下拉元素
- bash - 从服务器重新生成脚本获取服务器崩溃的输出
- pine-script - Pine Scripts plotshapes偏移问题
- excel - 在 Excel 工作表中组合相应的数据
- angular - 你将如何返回 Observable
从一个函数 - rcpp - Rcpp:获取临时对象类型代理的地址,从 CharacterVector 中获取子向量
- sql - 迄今为止的标准 SQL 字符串
- javascript - 如果类列表包含多个特定类
- clojure - 从 src 目录提供图像文件 - 404 错误