C# 异步任务发出警告,(无)异步任务发出错误

C# 异步任务发出警告,(无)异步任务发出错误,c#,asp.net-mvc,asynchronous,asp.net-core-viewcomponent,C#,Asp.net Mvc,Asynchronous,Asp.net Core Viewcomponent,这可能是一个更为巧妙的问题,但我在ViewComponent类中有以下方法 public async Task<IViewComponentResult> InvokeAsync() { return View(); } public异步任务InvokeAsync() { 返回视图(); } 但是名称InvokeAsync加了下划线,并给出了以下警告 此异步方法缺少“await”运算符,将同步运行。 考虑使用“Acess”操作符等待非阻塞API调用, 或“wait Tas

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

public async Task<IViewComponentResult> InvokeAsync()
{
    return View();
}
public异步任务InvokeAsync()
{
返回视图();
}
但是名称InvokeAsync加了下划线,并给出了以下警告

此异步方法缺少“await”运算符,将同步运行。 考虑使用“Acess”操作符等待非阻塞API调用, 或“wait Task.Run(…)”在后台线程上执行CPU限制的工作

但是如果我尝试从方法中删除异步,那么return View()将用红色下划线,并输出以下错误

“Microsoft.AspNetCore.Mvc.ViewComponents.ViewComponentResult”到 “System.Threading.Tasks.Task”MVCStateManagement

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


谢谢

您必须删除异步标志和
任务
。只需返回一个
IViewComponentResult

在执行异步工作时,通常会返回包装到
Task
中的对象。如果你不这样做,那就没有任何意义

从MSDN:

Task类表示返回 值,该值通常异步执行。任务对象 是基于任务的异步 模式首先在.NETFramework 4中引入。因为工作 由任务对象执行,通常异步执行 在线程池线程上,而不是在主线程上同步 应用程序线程,您可以使用Status属性以及 IsCanceled、IsCompleted和IsFaulted属性,以确定 任务的状态。最常见的是,lambda表达式用于指定 任务要执行的工作

编辑:

您也可以尝试返回:

return Task.FromResult<IViewComponentResult>(View());
返回任务.FromResult(View());

该方法在ViewcomponentResult任务上运行。 您可以使用以下命令在不使用async的情况下调用它:

public Task<IViewComponentResult> InvokeAsync()
{
  return Task.FromResult<IViewComponentResult>(View());
}
public Task InvokeAsync()
{
返回Task.FromResult(View());
}
您的警告将不再显示,代码将运行。
你也可以离开它。这两种方法都不会影响项目的性能。

不清楚为什么该方法被定义为一种首先返回任务的
异步
方法

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

public IViewComponentResult Invoke()
{
    return View();
}
同步方法不会因为添加了
async
关键字而神奇地变为异步

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

public Task InvokeAsync()
{
返回Task.FromResult(View());
}

我一直在学习本教程,这就是为什么它被定义为这样。@AluanHaddad:这一点很好。请看我的答案。在该教程中它是异步的原因是因为在该教程中它调用了一个异步方法:var items=await GetItemsAsync(maxPriority,isDone);。如果您的代码中没有调用asyc方法,那么就没有理由让您的方法是异步的,仅返回IViewComponentResult程序因此InvalidOperationException崩溃:视图组件“MVCStateManagement.ViewComponents.LayoutHeadServiceComponent”的方法“InvokeAsync”应声明为返回任务。这似乎是正确答案。谢谢你的帮助。如果你能帮我把答案记为正确答案的话@不道德的回答似乎比你快1分钟,但你的回答更详细。非常感谢你的时间和帮助。
public Task<IViewComponentResult> InvokeAsync()
{
    return Task.FromResult<IViewComponentResult>(View());
}