簡體   English   中英

在其他線程上運行異步方法的好處? (C#)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM