为什么调用Task.Result不会死锁?几个月前阅读这篇文章后,我已经非常擅长获取任务的结果并通过ConfigureAwait(false)或Task.Run不断包装对Task.Run的所有调用。但是,出于某种原因,以下代码成功完成:publicstaticvoidMain(string[]args){vararrays=DownloadMany();foreach(数组中的var数组);}IEnumerableDownloadMany(){string[]links={"http://google.com","http://microsoft.com","http://apple.com"};使用(varclient=newHttpClient()){foreach(链接中的varuri){Debug.WriteLine(“仍然在这里!”);yieldreturnclient.GetByteArrayAsync(uri).Result;//为什么不会出现死锁?}}}代码打印Stillhere!3次并退出。这是否特定于HttpClient,调用Result是否安全(就像编写它的人用ConfigureAwait(false)填充它一样)?Task.Result只会在某些SynchronizationContext存在时阻塞。在控制台应用程序中,它们都没有在ThreadPool上安排延续。就像使用ConfigureAwait(false)一样。例如,在UI线程中,有一个分派单个UI线程的延续。如果使用UI线程与Task.Result同步等待,则Task.Result在UI线程上完成的任务会死锁。此外,死锁取决于GetByteArrayAsync的实现。如果它是一个异步方法并且它在不使用ConfigureAwait(false)的情况下等待,那么您只能死锁。如果您愿意,可以使用StephenCleary的AsyncContext,它将适当的SynchronizationContext添加到您的控制台应用程序,以测试您的代码是否可以在UI应用程序(或ASP.Net)中阻塞。关于HttpClient(以及大多数.NET)的任务返回方法:它们在技术上不是异步的。他们不使用async和await关键字。他们只是返回一个任务。通常是Task.Factory.FromAsync的包装器。因此,无论如何阻止它们可能是“安全的”。以上就是C#学习教程:为什么不调用Task.Result死锁?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
