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

标签 c# asp.net-core async-await asp.net-identity

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

我遇到的问题是,每当我尝试通过异步访问任何上下文(即在本例中 UserManager<ApplicationUser> )时,它就会在访问时被处置。

比如我的 Controller 如下(我们关注的对象是 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;
}

注意 _userManager正在使用startup.cs中的Visual Studio模板默认设置进行注入(inject)

现在,在此 Controller 中的方法中,我尝试以下操作:

[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就会停止?因此 Controller 不应处置 _userManager对象直到完成? (显然这个逻辑是错误的)

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

最佳答案

更新操作以使用 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);
}

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

Async/Await - Best Practices in Asynchronous Programming

关于c# - 依赖注入(inject)的 UserManager 正在处理异步调用 (ASP.NET CORE),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41325518/

相关文章:

c# - WinForms 报表查看器 : mouse wheel scrolls two pages instead of one

c# - WebActivatorEx 在应用程序启动时导致 ArgumentException

asp.net-core - 在 VS Code 中构建之前运行 Gulp 任务

javascript - 如何使用 FormData 将文件提交到 MVC Action

c# - 强制绑定(bind)到数据源的复选框在尚未查看时更新

javascript - 如何正确地将 C# 对象列表解析为 Javascript。仅显示类似 "System.Collections.Generic.List` 1"的类型

c# - 一旦 API 可供请求,启动后执行异步代码

javascript - 如何在同步模式下获取 outputStream block ?

c# - 使用异步时未处理 SqlConnection

javascript - 如何在其他 try block 中访问 try block 中的变量?