依赖注入的UserManager在异步调用时被释放(ASP.NET CORE)

6

我正在使用内置依赖注入和asp.net身份验证的ASP.NET Core。

我的问题是,每当我尝试通过异步方式访问任何上下文(例如在此示例中的UserManager<ApplicationUser>),访问时它被释放了。

例如,我的控制器如下所示(我们关心的对象是UserManager

private readonly ApplicationDbContext _dbContext;
private readonly UserManager<ApplicationUser> _userManager;
private readonly ViewRender _view;
private readonly IConfiguration _config;

public UserController(ApplicationDbContext dbContext,
    UserManager<ApplicationUser> userManager,
    ViewRender view,
    IConfiguration config)
{
    this._dbContext = dbContext;
    this._userManager = userManager;
    this._view = view;
    this._config = config;
}

请注意,在startup.cs文件中,_userManager是使用Visual Studio模板的默认设置进行注入的。

现在,在此控制器的一个方法中,我尝试执行以下操作:

[HttpDelete]
public async void Delete(string id)
{

    var user = _userManager.Users.Where(a => a.Id == id).FirstOrDefault();
    user.Deleted = true;
    var result= await _userManager.UpdateAsync(user);

}

但当执行到await _userManager.UpdateAsync(user)时,会出现“对象已被处理”的错误。我理解async/await的执行是会在await处停止吗?因此,控制器不应该在完成之前处理_userManager对象,对吗?(显然这个逻辑是错误的)
一个可行的解决方案是不使用异步方法,而是调用_userManager.UpdateAsync(user).Result;,但我想了解异步/等待的工作原理。

1
重构删除操作为 async Task<IActionResult> Delete(string id) { ... return Ok(); } - Nkosi
但在这种特殊情况下,我不想让该方法返回任何东西? - Michael
然后使用 async Task,它转换为一个无返回值的方法。 - Nkosi
2
顺便提一下,FirstOrDefault()有一个重载函数可以在where()中使用过滤器。这样你就可以将它们合并到一个方法中,而不是链接它们。 - Sean B
1个回答

4

将更新操作的返回类型从 void 改为 Task:

[HttpDelete]
public async Task Delete(string id) {
    var user = _userManager.Users.Where(a => a.Id == id).FirstOrDefault();
    user.Deleted = true;
    var result= await _userManager.UpdateAsync(user);
}

为了更好地理解async/await,请阅读这篇文章

异步编程的最佳实践 - Async/Await


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接