3

Я кодирую интернет-приложение MVC 5 и хотел бы знать, как вызвать метод async из метода seed при создании базы данных.Вызов метода асинхронного метода из метода семени базы данных

Вот мой код:

public class ApplicationDbInitializer : CreateDatabaseIfNotExists<ApplicationDbContext> 
{ 
    protected override void Seed(ApplicationDbContext context) {    
     SetupAdminAndSampleObjectsDatabase(); 
     base.Seed(context); 
    } 
} 

В настоящее время, при вызове метода SetupAdminAndSampleObjectsDatabase, я получаю следующее сообщение об ошибке:

System.NotSupportedException: A second operation started on this context before a previous asynchronous operation completed. Use 'await' to ensure that any asynchronous operations have completed before calling another method on this context. Any instance members are not guaranteed to be thread safe.

Вот определение метода:

public async Task SetupAdminAndSampleObjectsDatabase() 

Я добавляю несколько объектов в этот метод.

Правильно ли я говорю, что указанная выше ошибка будет разрешена, если метод SetupAdminAndSampleObjectsDatabase вызывается с ключевым словом await?

Итак, в целом, как я могу вызвать метод async из базы данных seed метод? Это возможно?

Заранее спасибо.

ответ

2

Вы можете сделать одну из двух вещей:

1) Сделать метод Seed асинхра и использование ждет

protected override async void Seed(ApplicationDbContext context) {    
     await SetupAdminAndSampleObjectsDatabase(); 
     base.Seed(context); 
    } 

2) Используйте .WaitAndUnwrapException() по методе асинхронного

protected override void Seed(ApplicationDbContext context) {    
     SetupAdminAndSampleObjectsDatabase().WaitAndUnwrapException(); 
     base.Seed(context); 
    } 

Надеюсь, что это поможет!

+0

спасибо. Я не знал, что я могу добавить ключевое слово async в метод переопределения. – user3736648

+0

Просто обратите внимание, что если вы используете вариант 1, вам нужно будет изменить тип возврата 'SetupAdminAndSampleObjectsDatabase()' на 'Task', если он был изначально' void' или 'Task ' для любого исходного типа возврата 'T 'было для того, чтобы ждать. – akousmata

+0

Я бы не стал слишком оптимистичным, чтобы я мог уйти с вариантом 1. В этом случае вызывающий абонент не будет ждать созданную задачу, и вы можете получить ошибку, подобную этой: «Асинхронный модуль или обработчик завершен, пока асинхронная операция все еще ожидала ». MSDN утверждает, что async void возможно только «сделать асинхронные обработчики событий возможными». – Paul