[英]Benefits of running an asynchronous method on a different thread? (C#)
我在自己維護的項目中遇到了這些陳述:
var response = Task.Run(() =>
{
return httpClient.PostAsync(myUrl, myPayload);
}).Result;
它在另一個線程上運行異步方法來發出HTTP請求。
除非我缺少什么,否則在不同線程上運行異步方法還有其他好處嗎? 這樣不夠好嗎?
var response = await httpClient.PostAsync(myUrl, myPayload);
假設您了解您的第一個示例使用.Result
是阻塞的,第二個使用await
則不是。
現在回答您的問題-
它在另一個線程上運行異步方法來發出HTTP請求。
除非我缺少什么,否則在不同線程上運行異步方法還有其他好處嗎? 這樣不夠好嗎?
僅等待POST
調用返回數據而阻塞其他線程沒有任何好處。
是的,這是推薦的方法-
var response = await httpClient.PostAsync(myUrl, myPayload);
您可以在此處閱讀更多詳細信息
除非我缺少什么,否則在不同線程上運行異步方法還有其他好處嗎?
現有代碼不僅僅使用Task.Run
; 它使用Task.Run
,然后阻止生成的任務 。 這是“ 線程池黑客 ”的一種變體,它是阻止異步代碼的一種方法。 盡管代碼應該使用GetAwaiter().GetResult()
而不是Result
。
許多庫支持直接阻止而不是要求線程池破解。 HttpClient
尤其如此,但是在某些平台(移動平台,IIRC)上, HttpClient
出現一個錯誤,您無法直接阻止它。 因此,此代碼最有可能被用作“阻止黑客”。
在線程池線程上運行異步方法的另一個原因是:該線程是否執行某些同步工作。 同樣,這是HttpClient
的已知問題; 代理解析和DNS查找是同步完成的。 如果現有代碼正在await Task.Run(() => ...);
而不是Task.Run(() => ...).Result;
,那么我認為這種替代解釋更有可能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.