运行 异步方法在不同线程上的好处? (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 则不是。

现在回答你的问题-

It runs, on a different thread, an asynchronous method to make an HTTP request.

Unless I am missing something, is there any additional benefit in running an asynchronous method on a different thread? Wouldn't this be good enough?

仅仅为了等待对 return 数据的 POST 调用而阻塞一个额外的线程没有任何好处。

是的,这是推荐的做法 -

 var response = await httpClient.PostAsync(myUrl, myPayload);

您可以阅读更多详细信息here

Unless I am missing something, is there any additional benefit in running an asynchronous method on a different thread?

现有代码不仅仅使用Task.Run;它使用 Task.Run ,然后阻塞生成的任务 。这是“thread pool hack”的变体,它是一种阻塞异步代码的方法。虽然代码应该使用 GetAwaiter().GetResult() 而不是 Result.

许多库直接支持阻塞而不需要线程池 hack。 HttpClient 尤其是大多数情况下,但是有一些平台(移动平台,IIRC) HttpClient 有一个错误,您无法直接阻止它。所以这段代码很可能是作为 "blocking hack".


运行 线程池线程上的异步方法还有另一个原因:如果该线程执行一些同步工作。同样,这是 HttpClient 的一个已知问题;代理解析和 DNS 查找是同步完成的。如果现有代码是 await Task.Run(() => ...); 而不是 Task.Run(() => ...).Result;,那么我认为这种替代解释更有可能。