c# - 在 Web API 中正确使用 async/await

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

我有一个现有的业务库,我想使用 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);
    }
}

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

最佳答案

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

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

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

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

关于c# - 在 Web API 中正确使用 async/await,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34963879/

相关文章:

c# - 编程对象建议

c# - 顶级控件不能添加到控件

asp.net - 如何在 DLL 中添加 Web 服务引用

asp.net - 通过 smtppickupfolder 使用 MS 企业库日志记录应用程序 block 发送电子邮件?

asp.net - 如何检索由 jQuery 计算的标签/文本框等的值

c# - 设置 32 英尺库

c# - 原始输入 API 在 Windows 7/Vista 操作系统中的使用范围。它可以应用于整个环境还是只应用于焦点窗口?

c#创建一个不需要输入默认参数的方法

c# - 具有唯一键和值的组数据

c# - binarywriter.flush() 是否也刷新底层文件流对象?