依赖注入的 UserManager 正在处理异步调用 (ASP.NET CORE)

mic*_*ael 6 c# async-await asp.net-identity asp.net-core

我正在使用 ASP.NET Core 及其内置依赖项注入和 asp.net 身份。

我遇到的问题是,每当我尝试通过异步访问任何上下文(即在本例中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;
}
Run Code Online (Sandbox Code Playgroud)

请注意,_userManager正在使用startup.cs中的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);

}
Run Code Online (Sandbox Code Playgroud)

但是当await _userManager.UpdateAsync(user)被击中时,它会调用“对象已处置”错误。我对async/await的理解是执行到await就会停止?因此控制器不应该_userManager在对象完成之前处理它吗?(显然这个逻辑是错误的)

一个有效的解决方案是不使用 aysnc 方法,只调用_userManager.UpdateAsync(user).Result; 但想了解 aysnc/await

Nko*_*osi 4

更新操作以具有Task返回类型而不是void

[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);
}
Run Code Online (Sandbox Code Playgroud)

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

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