0

我正在开发一个 .net 核心 Web 应用程序,我遇到了一个问题,我的 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 时停止服务被处理?

4

1 回答 1

0

正如评论所暗示的那样,我没有提供足够的细节,但我在扩展问题时遇到了答案。我学到的是这样的:

总是返回 async Task 而不是 async void

无法访问已处置的对象。此错误的常见原因是处理上下文

在关闭范围之前等待您的任务:

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

如果您不等待您的任务,该功能将继续,范围将关闭并且您的服务将被释放。要了解 async 和 await 去这里:

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

于 2020-08-08T04:31:15.857 回答