【问题标题】:How to fix: The return type of an async method must be void, Task or Task<T> [AppName]如何解决:异步方法的返回类型必须为 void、Task 或 Task<T> [AppName]
【发布时间】:2017-05-18 18:41:00
【问题描述】:

我正在使用 VS Code 并遵循 ASP.NET Core/EF Core 教程,并承认我不太清楚 async、await 和 Task 的作用(嗯,我知道前两个,但不是第三个.) 我第一次实现了一个存储库,以及一个与之配套的 UnitofWork 类和接口。这是 UnitofWork 类:

using System.Threading.Tasks;

namespace vega.Persistence
{
  public class UnitOfWork : IUnitOfWork
  {
    private readonly VegaDbContext context;

    public UnitOfWork(VegaDbContext context)
    {
      this.context = context;
    }

    public async Task CompleteAsync()
    {
      await context.SaveChangesAsync();
    }
  }
}

当我将鼠标悬停在 CompleteAsync 操作名称上时,除了 VS-Code intellisense 显示的主题行错误之外,我还得到以下信息:

'UnitOfWork.CompleteAsync()': not all code paths return a value [AppName]

其他可能相关的sn-ps:

using System;
using System.Threading.Tasks;

namespace vega.Persistence
{
    public interface IUnitOfWork
    {
        Task CompleteAsync();
    }
}

在我的 Startup.cs 中:

public void ConfigureServices(IServiceCollection services)
{
    // Add Repository and UnitOfWork --scoped (instance persits for life of request),
    // not Transient or Singleton
    services.AddScoped<IVehicleRepository, VehicleRepository>();
    services.AddScoped<IUnitOfWork, UnitOfWork>();
}

【问题讨论】:

  • 真的很奇怪,我看不出你的代码有什么问题。也许这是 VS Code 的一个错误。您是否尝试在项目所在的文件夹中运行 dotnet build 以查看是否收到任何错误消息?顺便说一句,在使用 EF 时编写一个工作单元并不是很有用,DataContext 已经是一个 UnitOfWork 实现。如果您想将 DataContext 排除在控制器之外,您应该编写一个服务。
  • 是的。 => Build FAILED. Persistence\UnitOfWork.cs(14,23): error CS1983: The return type of an async method must be void, Task or Task&lt;T&gt; [C:\Users\..\Vega.csproj] 0 Warning(s) 1 Error(s)
  • 也恢复了项目,并重启了VS Code。
  • 你使用哪个版本的 .NET Core dotnet --version?您可以将您的项目发布到 GitHub 或以其他方式提供对它的访问权限吗?
  • 而错误信息是在CompleteAsync 方法上?我刚刚尝试将您的代码复制粘贴到一个新项目中,并且可以确认它确实构建了。您是否从某个地方复制粘贴您的代码?我有时会遇到一些奇怪的行为,“空格”字符不是真正的“空格”并且编译器吓坏了。您可以尝试重新输入(不复制粘贴)CompleteAsync 方法吗?

标签: asp.net-mvc async-await repository-pattern


【解决方案1】:

您在项目中定义了另一个 vega.Persistence.Task 类型。只需添加命名空间以更正 System.Threading.Tasks.Task 作为方法的返回类型:

public async System.Threading.Tasks.Task CompleteAsync()
{
    await context.SaveChangesAsync();
}

在您的界面中也是如此。

【讨论】:

  • 试过这个,但得到:Cannot implicitly convert type 'System.Threading.Tasks.Task&lt;int&gt;' to 'vega.Persistence.Task' [Vega]
  • 这是否暗示上下文是“持久性”而不是我实际的 DbContext 对象?
  • 那你刚刚回答了你自己的问题。您有 2 个名为 Task 的类,您的代码可能引用 vega.Persistence.Task 而不是 System.Threading.Tasks.Task...
  • @PatrickGomes,Marco 是对的。我已经更新了我的答案。我已经应用了更改,现在它可以编译了。
  • 呸!不知道它是如何到达那里的!那是一个空班。可能是无意中右键单击某处的结果。
猜你喜欢
  • 1970-01-01
  • 2011-10-24
  • 2020-04-12
  • 1970-01-01
  • 2022-06-21
  • 1970-01-01
  • 2014-08-14
  • 2017-06-04
  • 1970-01-01
相关资源
最近更新 更多