使用异步方法了解死锁

时间:2019-05-07 14:40:07

标签: c# multithreading asynchronous

我正在阅读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; 
}
  
      
  1. 如果您是从UI线程调用的,则将立即死锁,因为该任务正在排队等待UI线程,而该任务在到达Result属性时会被阻塞。

  2.   
  3. 如果从线程池线程中调用,则theadpool线程将被阻塞,如果工作量足够高,则会导致死锁。如果所有线程都在线程池中被阻塞,那么将没有人可以完成任务。

  4.   
  5. 但是,如果您是从主线程或专用线程进行调用,这种情况将适用。

  6.   

现在,为什么呢?假设分配了线程#1来执行此功能。在调用HttpClient.GetAsync(url).Result时,它将被阻塞,直到API或任何网络组件完成请求为止。也许所有其他线程在同一条语句中被阻塞。 但是在某个时候,请求将得到答复,线程将被解除阻塞,对吗?因此,当该线程变为非阻塞状态时,它可以继续执行。

有什么我想念的吗?不会专门创建一个线程来解除阻塞等待网络操作的线程吗?

谢谢

0 个答案:

没有答案