我正在阅读C#和其他异步方法中有关async/await
的文章。在一个部分中,它显示了此示例,并提到了它为什么会死锁:
public String DownloadStringV3(String url)
{
// NOT SAFE, instant deadlock when called from UI thread
// deadlock when called from threadpool, works fine on console
var request = HttpClient.GetAsync(url).Result;
var download = request.Content.ReadAsStringAsync().Result;
return download;
}
如果您是从UI线程调用的,则将立即死锁,因为该任务正在排队等待UI线程,而该任务在到达Result属性时会被阻塞。
如果从线程池线程中调用,则theadpool线程将被阻塞,如果工作量足够高,则会导致死锁。如果所有线程都在线程池中被阻塞,那么将没有人可以完成任务。
但是,如果您是从主线程或专用线程进行调用,这种情况将适用。
现在,为什么呢?假设分配了线程#1来执行此功能。在调用HttpClient.GetAsync(url).Result
时,它将被阻塞,直到API或任何网络组件完成请求为止。也许所有其他线程在同一条语句中被阻塞。 但是在某个时候,请求将得到答复,线程将被解除阻塞,对吗?因此,当该线程变为非阻塞状态时,它可以继续执行。
有什么我想念的吗?不会专门创建一个线程来解除阻塞等待网络操作的线程吗?
谢谢