Почему контейнер DI уничтожает контекст после ожидания асинхронной операции?

#c# #asp.net #asp.net-core #dependency-injection #async-await

Вопрос:

У меня есть несколько таможенных служб, зарегистрированных в Startup.cs :

 public void ConfigureServices(IServiceCollection services)  {  var connection = Configuration.GetConnectionString("WebConnection");  services.AddDbContextlt;ApplicationContextgt;(options =gt; options.UseSqlServer(connection));   services.AddTransientlt;FileHandlergt;();   **more boring services below**   }  

Мой FileHandler зависит от контекста бд, зависимость вводится через конструктор:

 public FileHandler(ApplicationContext db)  {  _db = db;  }   ApplicationContext _db;  

Позже в моем коде я запускаю:

 var user = await CreateUserAsync();  

где CreateUserAsync() расшифровывается:

 async Tasklt;Usergt; CreateUserAsync()  {  var user = new User  {  PatientCode = PatientId,  Password = _provider.GetRandomAlphanumericString()  };   var userRole = await _db.Roles.FirstOrDefaultAsync(r =gt; r.Name == "user");   if (userRole != null)  user.Role = userRole;   await _db.Users.AddAsync(user);   await _db.SaveChangesAsync();   return user;  }  

Здесь каждый раз после первой асинхронности/ожидания мой _db удаляется. С помощью этого кода строка выдает ошибку «Не удается получить доступ к удаленному экземпляру контекста». await _db.Users.AddAsync(user); Если я удалю все асинхронные и ожидающие модификаторы:

 User CreateUserAsync() {  var user = new User  {  PatientCode = PatientId,  Password = _provider.GetRandomAlphanumericString()  };   var userRole = _db.Roles.FirstOrDefault(r =gt; r.Name == "user");   if (userRole != null)  user.Role = userRole;   _db.Users.Add(user);   _db.SaveChanges();   return user; }  

код работает так, как должен. Почему это происходит именно так? Пытался сам исследовать проблему, люди говорят, что обычно это происходит, когда вы пропускаете какое-то ожидание (если вы не ждете окончания асинхронной операции), но, думаю, это не мой случай. Любая помощь будет высоко оценена.

Комментарии:

1. Вам нужно предоставить больше контекста о том, где вы вызываете CreateUserAsync , вероятно, забудьте о некоторых ожиданиях для какой-либо асинхронной функции.