c# - 在方法签名中使用异步关键字返回 Web Api 端点中的任务

标签 c# .net asp.net-web-api async-await task

如果我想通过返回一个 Task 对象来编写一个非阻塞的 web api 操作,我可以使用或不使用 async 关键字来完成它:

使用异步

public async Task<HttpResponseMessage> Get()
{
    Func<HttpResponseMessage> slowCall = () =>
    {
        Thread.Sleep(2000);
        return Request.CreateResponse(HttpStatusCode.OK, "Hello world");
    };

    var task = Task<HttpResponseMessage>.Factory.StartNew(slowCall);
    return await task;
}

不使用异步

public Task<HttpResponseMessage> Get()
{
    Func<HttpResponseMessage> slowCall = () =>
    {
        Thread.Sleep(2000);
        return Request.CreateResponse(HttpStatusCode.OK, "Hello world");
    };

    var task = Task<HttpResponseMessage>.Factory.StartNew(slowCall);
    return task;
}

它们都能正常工作。但是,我在(在线和书籍中)看到的关于编写返回 Task 的 web api 操作的每个示例都使用 async 关键字。当然,我知道这给了你更大的灵 active ,因为它允许你控制你想要“等待”什么,什么不是。但假设您的功能可以通过任何一种方式得到有效处理,

  • 使用一种方法与另一种方法相比有什么优势吗?
  • 我是否应该始终使用 async 关键字(如果是,为什么)?
  • 还是无关紧要?

最佳答案

async 关键字允许您通过创建状态机在您的方法中使用 await。如果您可以在不使用它的情况下设法返回一个异步任务,您可以继续并删除它,因为它有一些(非常小的)开销。请记住,它仅在少数情况下有用。您的 return await 就是其中之一。

另一个区别是如何处理异常。如果方法的同步部分出现异常并且标记为 async,则异常将存储在返回的任务中。如果没有关键字,异常将被定期抛出。例如在这种情况下有很大的不同:

var task = Get(); // unhandled exception without async
try
{
    var result = await task; // handled exception with async
}
catch
{
}

我的建议是使用 async 关键字,即使您并非绝对需要*,因为大多数开发人员不理解其中的区别,而且优化的值(value)几乎可以忽略不计。


* 除非你和你的队友真的知道你在做什么。

关于c# - 在方法签名中使用异步关键字返回 Web Api 端点中的任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26205173/

相关文章:

c# - .NET 中是否有可序列化的通用键/值对类?

.net - 废弃整个命名空间?

c# - 如何在每个请求上从 IoC 容器解析 Web API 消息处理程序/DelegatingHandler

c# - 在 Multi-Tenancy .net 项目中实现角色的最佳方式是什么?

asp.net-mvc - angularjs 仅带有 cshtml 页面,而不是带有 web api 2 的 html 页面

c# - Entity Framework (.NET 完整框架)订购包括

c# - 计算相对路径变化

c# - 使用 HttpClient 时避免从异步函数返回类型 Task<Object>

c# - 向用户呈现文件的 XML 值的最佳方式?

.Net DataVisualization.Charting Y 轴上的格式值