gpt4 book ai didi

c# - 异步任务 与任务

转载 作者:太空狗 更新时间:2023-10-29 21:21:09 26 4
gpt4 key购买 nike

我有一个只有一个 Action 的 Controller 。在这个 Action 方法中,我有一个 async我调用的方法就是这样。这是我正在使用的代码:

[HttpGet]
public Task<MyObject> Get()
{
return _task.GetMyObject()
}

这正确地序列化为我期望的 JSON。现在我的经理坚持要将签名更改为以下内容:

[HttpGet]
public async Task<IActionResult> Get()
{
var data = await_task.GetMyObject();
return Ok(data);
}

我相信代码没有理由 await在 Controller 中,可以只返回 Task因为之后的一切都取决于结果。除了为 await 完成的额外代码生成(创建状态机等)之外,WebApi 是否有任何影响?这些方法的观点?澄清一下,我想知道是否返回 IActionResult比只返回 Task<MyObject> 更好即使看起来结果是一样的。

最佳答案

任务

专业版

单元测试不需要任何转换,

 Product product = await controller.Get();

最大的优势是,您的单元测试真正独立于底层 HTTP 堆栈。

Swagger 不需要任何额外的属性来生成响应模式,因为 swagger 可以轻松检测结果类型。

另一大优势是,当逻辑保持不变时,您可以在其他 Controller 中重用您的 Controller 。

在返回之前避免 await 也会稍微提高性能,因为那部分代码不需要任务状态机。我认为 future 的 C# 版本将省略 single await 作为编译器优化。

反对

返回错误状态代码需要抛出异常..

    throw new HttpStatusException(404, "File not found");
throw new HttpStatusException(409, "Unauthorized");

任务< IAsyncResult>

专业版

您可以返回 HTTP 状态代码,例如

 return NotFound(); // (Status Code = 404)
return Unauthorized(); // (Status Code = 409)

反对

单元测试需要额外的转换..

 Product productResult = ((await controller.Get()) as OkResult).Result as Product;

由于这种转换,很难在其他 Controller 中重用您的 Controller ,从而导致逻辑重复。

Swagger 生成器需要额外的属性来生成响应模式

 [ProducesResponseType(typeof(Product), 200)]

仅当您处理不属于单元测试的逻辑且不属于您的业务逻辑(例如 OAuth 与您希望更多关注的第三方服务的集成)时才推荐使用此方法基于 IActionResult 的结果,例如 ChallengeRedirect

关于c# - 异步任务<IActionResult> 与任务<T>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48415095/

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