Я часто использую async/await, чтобы гарантировать, что потоки ASP.NET MVC Web API не блокируются более длительными операциями ввода-вывода и сети, в частности вызовы базы данных.
Пространство имен System.Data.Entity предоставляет здесь множество вспомогательных расширений, таких как FirstOrDefaultAsync, ContainsAsync, CountAsync и т.д.
Однако, поскольку контексты данных не являются потокобезопасными, это означает, что следующий код проблематичен:
var dbContext = new DbContext();
var something = await dbContext.someEntities.FirstOrDefaultAsync(e => e.Id == 1);
var morething = await dbContext.someEntities.FirstOrDefaultAsync(e => e.Id == 2);
Фактически, я иногда вижу исключения, такие как:
System.InvalidOperationException: Соединение не было закрыто. Состояние текущего соединения открыто.
Является ли правильным шаблоном использовать отдельный блок using(new DbContext...)
для каждого асинхронного вызова в базе данных? Возможно ли более выгодно вместо этого выполнять синхронное?