.net - 在 Task.Run() 中包装同步调用以使其异步有益吗?

标签 .net async-await asp.net-web-api

我提出这个问题的动机是因为我正在创建一个 .net web API 项目,该项目将使用具有同步方法的现有 neo4j rest api 客户端。我想通过使用异步方法来利用一些性能提升,但我想避免进入 neo4j api 库并重构同步方法以返回异步方法。我想知道在 await Task.Run() 中包装对同步方法的调用是否有好处。具体来说,在第一个示例中,当 httpClient 的异步结果调用 Wait() 方法时会发生什么,但整个过程都包含在另一个 await 中。

还请记住,我将在 AppHarbor 云上使用我认为的单个虚拟核心运行它。

下面也是

  //what happens with the synchronous rest api client I am using
  HttpResponseMessage SendHttpRequest(HttpRequestMessage request)
  {

        var requestTask = httpClient.SendAsync(request);
        requestTask.Wait();
        return requestTask.Result;

  }

  object result = await Task.Run(() =>
  {
      return SendHttpRequest(request);
  });

性能类似于
 return httpClient.SendAsync(request)

最佳答案

I'd like to take advantage of some of the performance gains by going to asynchronous methods, but I want to avoid going into the neo4j api library and refactoring the synchronous methods to return async methods.



对不起,您失去了async的所有好处如果您只是将同步代码包装在 Task.Run 中,则在服务器端.
async在服务器上很好,因为异步操作比线程更好地扩展。但如果你使用 Task.Run ,那么您无论如何都在使用线程。

关于.net - 在 Task.Run() 中包装同步调用以使其异步有益吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13071833/

相关文章:

c# - 如何使用 .NET 在内存中动态创建 jpg 图像?

flutter - 无法在dart中的then函数中将值分配给外部函数变量

C# 潜在的面试问题......太难了?

c# - 如何从另一个 MDI 子窗体关闭特定的 MDI 子窗体

c# - 如何在不使用 .net 中的属性的情况下在 dynamodb 中映射类属性

javascript - 是否有可能从 async/await 获得 "in-progress"响应,然后使用它来显示等待完成之前服务器当前正在做什么?

c# - Xamarin HttpClient.PostAsync 任务在 Android 中超时,在 iOS 中有效

iis - 许多自托管 SSL owin 服务器

.net - Global.asax ASP.Net Web API 中的 GlobalConfiguration.Configuration.EnsureInitialized() 是什么

.net - Web api 抛出 HttpResponseException 以及如何在 wpf 客户端上接收