. Net core - Остановить службу / usermanager от удаления / сохранить службу в рабочем состоянии - PullRequest
0 голосов
/ 07 августа 2020

Я разрабатываю базовое веб-приложение. net, и у меня возникла проблема, когда мой Usermanager удаляется, что приводит к ошибке.

public async void DeleteInactiveUserData()
{
    var dayAgo = DateTimeOffset.UtcNow.AddDays(-1);
    var inactiveGuests = _userManager.Users.Where(u => u.Guest && u.LastLoginDate < dayAgo);
    var yearAgo = DateTimeOffset.UtcNow.AddYears(-1);
    var inactiveUsers = _userManager.Users.Where(u => !u.Guest && u.LastLoginDate < yearAgo);
    var toBeDeletedUsers = inactiveGuests.Concat(inactiveUsers).ToList();
    for (int i = toBeDeletedUsers.Count() - 1; i >= 0; i--)
    {
        var user = toBeDeletedUsers[i];
        _logger.LogInformation("Deleting user " + user.UserName + " for inactivity.");
        await _userManager.DeleteAsync(user); // Usermanager is disposed here
    }
}

Как мне остановить работу службы удаляется при использовании await?

1 Ответ

0 голосов
/ 08 августа 2020

Как следует из комментариев, я не предоставил достаточно деталей, но я натолкнулся на ответ, расширяя вопрос. Я узнал следующее:

Всегда возвращать asyn c Task вместо asyn c void

Невозможно получить доступ к удаленному объекту. Распространенной причиной этой ошибки является удаление контекста

Ожидайте выполнения задачи перед закрытием области:

using (var scope = _serviceScopeFactory.CreateScope())
        {
            var accountServive = scope.ServiceProvider.GetService<IAccountService>();
            await accountServive.DeleteInactiveUserData();
        }

Если вы не ожидаете выполнения задачи, функция будет продолжена, область закроется, и ваши услуги будут удалены. Чтобы узнать об asyn c и ждать go здесь:

https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/async/

...