gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:20:23 25 4
gpt4 key购买 nike

如果我想通过返回一个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com