【问题标题】:Async Task gives warning, (without) Async Task gives error异步任务给出警告,(没有)异步任务给出错误
【发布时间】:2019-01-28 17:51:18
【问题描述】:

这可能是一个更巧妙的问题,但我在 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

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

谢谢!

【问题讨论】:

  • 我正在关注本教程 docs.microsoft.com/en-us/aspnet/core/mvc/views/… 这就是它被定义的原因。
  • @AluanHaddad:好点。看我的回答。
  • 该教程中它是异步的原因是因为在教程中它调用了一个异步方法:var items = await GetItemsAsync(maxPriority, isDone);。如果您没有在代码中调用 asyc 方法,则没有理由让您的方法异步。

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


【解决方案1】:

尚不清楚为什么该方法被定义为首先返回Task&lt;IViewComponentResult&gt;async 方法。

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

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

同步方法不会因为你添加了async关键字就神奇地变成异步的。

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

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

【讨论】:

  • @Immorality 的回答似乎比你快 1 分钟,但你的回答更详细。非常感谢您的时间和帮助。
【解决方案2】:

该方法在 ViewcomponentResult 的 Task 上运行。 您可以使用以下方法在不异步的情况下调用它:

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

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

【讨论】:

  • 这似乎是正确的答案。感谢您的帮助。
  • 如果您愿意将答案标记为正确答案!
【解决方案3】:

您必须删除异步标志和Task&lt;&gt;。只需返回 IViewComponentResult

当您执行异步工作时,通常会返回一个包裹在 Task&lt;&gt; 中的对象。如果你不这样做没有任何意义。

来自 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());

【讨论】:

  • 如果我尝试删除任务,只返回一个 IViewComponentResult 程序会因 InvalidOperationException 崩溃:视图组件“MVCStateManagement.ViewComponents.LayoutHeaderViewComponent”的方法“InvokeAsync”应声明为返回任务.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多