我从实体框架类派生了以下类,如下所示。
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的可接受方案之一。我还有什么其他选择?
答案 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)
}
}