我正在阅读这篇关于死锁的文章,我尝试使用自己的代码,它没有死锁问题。为什么?我期待:GetJsonAsync完成等待并即将返回jsonStringMain正在执行并保留上下文jsonTask.ResultGetJsonAsync想要返回,直到上下文可用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; }
1 回答
慕后森
TA贡献1802条经验 获得超5个赞
它不会死锁,因为没有同步,因此该方法在线程池线程(而不是主线程)上恢复执行。SynchronizationContext
async
本文的相关引文(着重号为作者所加):
情况是这样的:请记住,在我的介绍性帖子中,在您等待任务后,当方法继续时,它将在上下文中继续。
在第一种情况下,此上下文是 UI 上下文(适用于控制台应用程序以外的任何 UI)。在第二种情况下,此上下文是 ASP.NET 请求上下文...
对于 UI 示例,“上下文”是 UI 上下文;对于 ASP.NET 示例,“上下文”是 ASP.NET 请求上下文。这种类型的死锁可以对任何一个“上下文”造成。
如果你确实希望以这种方式使控制台应用程序死锁,则可以使用我的 AsyncEx
库中在控制台应用程序的主线程上安装单线程上下文。AsyncContext
- 1 回答
- 0 关注
- 69 浏览
添加回答
举报
0/150
提交
取消