这可能是一个更精致的问题,但是我在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
所以我的问题是我应该采取什么方法?让异步方式在那里发出警告,或者是否有针对此警告的解决方法/解决方案?这对我的项目有很大影响吗?
谢谢!
答案 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());
}
您的警告将不再显示,您的代码将运行。 您也可以离开它。两者都不会影响您的项目性能。