如何修复:异步方法的返回类型必须是void、Task或Task<T> [AppName]

3

我正在使用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智能感知显示的主题行错误之外,我还遇到了这个问题:

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

其他可能相关的片段:

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 的一个 bug。你是否尝试在项目所在的文件夹中运行 dotnet build,以查看是否会出现任何错误消息?顺便说一句,在使用 EF 时编写工作单元并不是非常有用,因为 DataContext 已经是一个 UnitOfWork 实现。如果你想将 DataContext 从控制器中排除,应该编写一个服务。 - Gimly
构建失败。Persistence\UnitOfWork.cs(14,23): 错误 CS1983: 异步方法的返回类型必须是 void、Task 或 Task<T> [C:\Users..\Vega.csproj] 0 个警告 1 个错误 - PakiPat
1
错误信息出现在CompleteAsync方法上?我刚试着将你的代码复制粘贴到一个新项目中,可以确认它确实构建成功。你是从其他地方复制粘贴的代码吗?有时候空格字符可能不是真正的“空格”,编译器会崩溃。你能尝试重新输入(而不是复制粘贴)CompleteAsync方法吗? - Gimly
<PackageReference Include="Microsoft.AspNetCore" Version="1.1.0" />https://github.com/patrickgomes1968/vega - PakiPat
嗯...我确实复制粘贴了代码--但只是在我的自己看似相同的代码返回相同异常之后。 - PakiPat
显示剩余2条评论
1个回答

5

你的项目中已经有另一个 vega.Persistence.Task 类型定义。只需要将该命名空间添加到你的方法的返回类型中,正确地使用 System.Threading.Tasks.Task

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

并在您的界面中执行相同操作。

这是否意味着上下文是“持久性”,而不是我的实际DbContext对象? - PakiPat
3
那么,你刚才回答了自己的问题。你有两个名为Task的类,你的代码可能引用了vega.Persistence.Task而不是System.Threading.Tasks.Task。 - Marko
1
@PatrickGomes,Marco是对的。我已经更新了我的答案。我已经应用了更改,现在它可以编译了。 - Andrii Litvinov
哎呀!不知道它怎么到那里的!那是一个空类。可能是无意中在某个地方右键单击的结果。 - PakiPat
很可能是因为您编写了名为“Task”的类,但没有添加Using语句(或引用依赖项)。上下文菜单有一个选项可以自动为您创建该名称的类。 - MindingData
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接