看一下这个例子,Stephen为您提供了一个清晰的答案:
因此,这是从顶级方法(
Button1_Click对于UI /MyController.Get对于ASP.NET)开始的事情:
顶级方法调用
GetJsonAsync(在UI / ASP.NET上下文中)。 GetJsonAsync通过调用HttpClient.GetStringAsync(仍在上下文中)启动REST请求。 GetStringAsync返回uncompletedTask,指示REST请求未完成。4.
GetJsonAsync等待的Task归还GetStringAsync。上下文被捕获,以后将用于继续运行该GetJsonAsync方法。GetJsonAsync返回uncompletedTask,指示该GetJsonAsync方法不完整。
顶级方法同步阻止
Task返回的GetJsonAsync。这将阻塞上下文线程。…最终,REST请求将完成。这样就完成了
Task由返回的GetStringAsync。 GetJsonAsync现在,可以继续运行for的延续,它等待上下文可用,以便可以在上下文中执行。死锁
。顶级方法正在阻止上下文线程,等待GetJsonAsync完成,并且GetJsonAsync正在等待上下文空闲以便可以完成。对于UI示例,“上下文”是UI上下文。对于ASP.NET示例,“上下文”是ASP.NET请求上下文。这种死锁可能是由于“上下文”引起的。
您应该阅读另一个链接: 等待,UI和死锁! 天啊!



