首页 > 解决方案 > ASP.NET 核心任务没有异步就无法返回 NotFound() 和 OK()

问题描述

此函数给出错误:

[HttpPost]
public Task<IActionResult> Something (string value)
{
     Student student = new Student();
     if (value == "LOW")
     {
         return NotFound();
     }

     return Ok();
}

此功能工作正常:

[HttpPost]
public async Task<IActionResult> Something (string value)
{
     Student student = new Student();
     if (value == "LOW")
     {
         return NotFound();
     }
     return Ok();
}

如上所示,当我尝试return NotFound();或之前return Ok();不包含关键字时,它会给我错误。但是,当我在前面添加关键字时,它不会在编译器中显示任何错误。你能告诉我这是什么原因造成的吗?asnycTaskasyncTask

标签: c#asp.net-core

解决方案


async关键字告诉编译器,当方法返回 a 时,方法Task中的代码应该以异步方式运行,并且在内部运行await。编译器将查找一个或多个awaits 并修改方法的结构以将功能包装在任务和任务的延续中。所以最终编译器会将返回的结果包装在 aTask<T>中。

基本上,你的逻辑可以专注于你想要返回的值,而不是专注于异步的结构。async和关键字的await存在是为了使该部分更简单。

所以这两种方法其实都有一个问题:

  1. 第一种方法 is not async,因此编译器不希望以任何方式修改它。相反,编译器期望它返回它说它将返回的内容,即Task<IActionResult>. 它不会返回,因此编译器会产生错误。
  2. 第二种方法是async,但在该方法中没有await任何作用。编译器可以完成这项工作,但会产生一个警告,表明此async方法中没有等待任何内容。

所以两者都是错误的。由于您的方法没有执行任何异步操作,因此请不要这样做async

[HttpPost]
public IActionResult Something(string value)
{
    Student student = new Student();
    if (value == "LOW")
    {
        return NotFound();
    }
    return Ok();
}

如果方法内部需要某些东西,您只需要创建方法async(并围绕返回类型包装) 。Task<T>await


推荐阅读