我正在使用内置依赖注入和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;
,但我想了解异步/等待的工作原理。
async Task<IActionResult> Delete(string id) { ... return Ok(); }
。 - Nkosiasync Task
,它转换为一个无返回值的方法。 - Nkosi