UserManager
наряду со многими другими типами - это сервис, который имеет срок действия в области действия . Это означает, что они действительны только в течение времени жизни одного запроса.
Это также означает, что удерживать экземпляр дольше не безопасно. В этом конкретном примере UserManager
зависит от UserStore
, который зависит от соединения с базой данных - и они обязательно будут закрыты после завершения запроса.
Если вам нужно запустить что-то за пределами контекст запроса, например, в фоновом потоке или, в вашем случае, при каком-то временном выполнении, тогда вы должны сами создать область обслуживания и получить бесплатный экземпляр sh зависимости, на которую вы полагаетесь.
Для этого введите IServiceScopeFactory
, а затем используйте его для создания области в вашего кода таймера. Это также относится ко всем остальным зависимостям, например к вашему репозиторию, для которого также требуется подключение к базе данных:
Timer = new System.Threading.Timer(async (e) =>
{
using (var scope = serviceScopeFactory.CreateScope())
{
var conversationsRepo = scope.ServiceProvider.GetService<ConversionsRepository>();
var userManager = scope.ServiceProvider.GetService<UserManager<User>>();
// do stuff
}
}, null, startTimeSpan, periodTimeSpan);