首页 文章

异步任务发出警告,(没有)异步任务给出错误

提问于
浏览
2

这可能是一个更精细的问题,但我在ViewComponent类中有以下方法

public async Task<IViewComponentResult> InvokeAsync()
{
    return View();
}

但InvokeAsync名称带有下划线并给出以下警告

这种异步方法缺少'等待'运算符并将同步运行 . 考虑使用'await'运算符等待非阻塞API调用,或'await Task.Run(...)'在后台线程上执行CPU绑定工作

但如果我尝试从方法中删除异步,则返回View()带有红色下划线并输出以下错误

'Microsoft.AspNetCore.Mvc.ViewComponents.ViewViewComponentResult'到'System.Threading.Tasks.Task'MVCStateManagement

所以我的问题是我应该采取什么方法?让异步显示警告,或者是否有针对此警告的解决方法/修复方法?它对我的项目有多大影响吗?

谢谢!

3 回答

  • 1

    目前还不清楚为什么该方法被定义为首先返回 Task<IViewComponentResult>async 方法 .

    由于该方法似乎是真正的同步并且只是返回一个视图,您应该像这样定义它:

    public IViewComponentResult Invoke()
    {
        return View();
    }
    

    同步方法不会因为您向其添加 async 关键字而神奇地变为异步 .

    如果您正在实现接口并且无法更改方法的签名,则可以使用 Task.FromResult 方法返回已完成的任务(您仍应删除 async 关键字):

    public Task<IViewComponentResult> InvokeAsync()
    {
        return Task.FromResult<IViewComponentResult>(View());
    }
    
  • 1

    该方法在ViewcomponentResult的Task上运行 . 你可以使用这个来调用它而不是异步:

    public Task<IViewComponentResult> InvokeAsync()
    {
      return Task.FromResult<IViewComponentResult>(View());
    }
    

    您的警告将不再显示,您的代码将会运行 . 你也可以离开它 . 两者都不会对项目的性能产生影响 .

  • 1

    您必须删除异步标志和 Task<> . 只需返回一个 IViewComponentResult .

    执行异步工作时,您将以简单的方式返回包裹在 Task<> 中的对象 . 如果你不这样做没有任何意义 .

    来自MSDN:

    Task类表示一个返回值的操作,通常以异步方式执行 . 任务对象是.NET Framework 4中首次引入的基于任务的异步模式的核心组件之一 . 因为Task对象执行的工作通常在线程池线程上异步执行而不是在主应用程序线程上同步执行,所以可以使用Status属性以及IsCanceled,IsCompleted和IsFaulted属性来确定任务的状态 . 最常见的是,lambda表达式用于指定任务要执行的工作 .

    https://docs.microsoft.com/en-us/dotnet/api/system.threading.tasks.task-1?view=netframework-4.7.2

    编辑:

    您也可以尝试返回:

    return Task.FromResult<IViewComponentResult>(View());
    

相关问题