【问题标题】:Proper use of async/await in Web API在 Web API 中正确使用 async/await
【发布时间】:2016-01-23 13:13:12
【问题描述】:

我有一个现有的业务库,我想使用 Web API 公开它。我现有的商务舱看起来像

public class Business
{
    public bool DoSomeBusiness()
    {
        //Performing long running  DB operations
        return true;
    }
    //Other methods
}

我正在编写一个 Web API 方法,如以下代码并使用 asyn/await 以获得更好的可扩展性。

public class SampleController : ApiController
{
    Business _business;
    public ValuesController(Business business)
    {
       _business = business;
    }
    public async Task<HttpResponseMessage> Get()
    {
       var result= await Task.Run(() => _business.DoSomeBusiness());
       return Request.CreateResponse(HttpStatusCode.OK, result);
    }
}

这种方法正确吗?我会从异步行为中获得真正的好处吗?我不想更改我现有的业务层实现以使其基于任务。

【问题讨论】:

  • 等待调用链应以 .NET Framework BCL 异步方法结束。您的 DoSomeBusiness 仍然是一种同步方法,因此不会给您带来任何好处。对 async/await 的理解很容易出错,所以尽量深入挖掘,最好找一本好书。
  • 你使用什么进行数据库操作?实体框架?原始 ADO.NET?将示例 db 调用添加到您的示例代码中,我应该能够引导您朝着正确的方向前进。
  • 我们使用 ADO.NET 进行 db 调用。

标签: c# asp.net .net asp.net-mvc asp.net-web-api


【解决方案1】:

这无济于事。如果是这样,ASP.NET 可以在 Task.Run 调用中自动运行您的操作并获得更好的可伸缩性。

你不能作弊。您需要一直使用异步直到您正在制作的 IO。这会感染一切,这就是为什么应该在需要时而不是默认情况下这样做。

我将链接您关于做出此选择的两个基本帖子,因为现在您对主题的理解不足以做出选择:

https://stackoverflow.com/a/25087273/122718 为什么 EF 6 教程使用异步调用? https://stackoverflow.com/a/12796711/122718我们应该切换到默认使用异步 I/O 吗?

【讨论】:

    猜你喜欢
    • 2013-08-14
    • 1970-01-01
    • 2021-11-18
    • 1970-01-01
    • 1970-01-01
    • 2020-08-23
    • 1970-01-01
    • 2018-01-28
    • 1970-01-01
    相关资源
    最近更新 更多