C#无法用异步任务替换void

时间:2015-05-14 19:16:29

标签: c# async-await

我从实体框架类派生了以下类,如下所示。

internal class MyInitializer : CreateDatabaseIfNotExists<ConfigurationDbContext>
{
    protected override async void Seed(ConfigurationDbContext context)
    {
        await DbHelper.AddSampleDataAsync(context);
        base.Seed(context);
    }
}

当我更改&#34; void&#34;时,我收到以下编译器错误to&#34; async Task&#34;。

return type must be 'void' to match overridden member

async / await最佳实践告诉您几乎总是返回异步Task而不是void。只是想确保我在这里使用void是使用void的可接受方案之一。我还有什么其他选择?

2 个答案:

答案 0 :(得分:2)

在C#中,被覆盖的成员必须具有与它们覆盖的方法完全相同的签名。你很简单,不能用另一种不同返回类型的方法覆盖一个方法。

因为基类期望方法同步运行,所以在返回之前必须等待异步方法完成。

internal class MyInitializer : CreateDatabaseIfNotExists<ConfigurationDbContext>
{
    protected override void Seed(ConfigurationDbContext context)
    {
        DbHelper.AddSampleDataAsync(context).Wait();
        base.Seed(context);
    }
}

答案 1 :(得分:2)

覆盖方法时,它必须与基类的原始方法(或接口/抽象类)具有相同的签名。我想根据这个问题,Seed()的预期行为是同步操作。因此,覆盖它并将行为完全改变为异步并不是一个好主意。

相反,您应该创建第二个异步方法,并保持同步方法。

下面的这个方法(由@DanielEarwicker建议)允许您通过等待Seed()的同步版本中的异步操作来完成同步和异步版本

internal class MyInitializer : CreateDatabaseIfNotExists<ConfigurationDbContext>
{
    protected override void Seed(ConfigurationDbContext context)
    {
        SeedAsync(context).Wait();
    }

    protected async Task SeedAsync(ConfigurationDbContext context)
    {
        await DbHelper.AddSampleDataAsync(context);
        base.Seed(context)
    }
}