异步任务给出警告,(无)异步任务给出错误

时间:2018-08-22 12:52:43

标签: c# asp.net-mvc asynchronous asp.net-core-viewcomponent

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

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

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

  

此异步方法缺少“等待”运算符,将同步运行。   考虑使用“ await”运算符来等待非阻塞API调用,   或'await Task.Run(...)'在后台线程上进行CPU绑定的工作

但是如果我尝试从方法中删除 async ,则 return View()用红色下划线标记并输出以下错误

  

“ Microsoft.AspNetCore.Mvc.ViewComponents.ViewViewComponentResult”以   'System.Threading.Tasks.Task'MVCStateManagement

所以我的问题是我应该采取什么方法?让异步方式在那里发出警告,或者是否有针对此警告的解决方法/解决方案?这对我的项目有很大影响吗?

谢谢!

3 个答案:

答案 0 :(得分:2)

目前尚不清楚为什么将该方法定义为首先返回async的{​​{1}}方法。

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

Task<IViewComponentResult>

仅向您添加public IViewComponentResult Invoke() { return View(); } 关键字,同步方法就不会神奇地变为异步。

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

async

答案 1 :(得分: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());

答案 2 :(得分:1)

该方法在ViewcomponentResult的Task上运行。 您可以使用以下方法调用它而无需异步:

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

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