最初我在MVC Razor应用程序中遇到了以下错误(在完成页面加载之前单击某些选项两次):
在上一个操作之前在此上下文上启动了第二个操作异步操作已完成。使用"等待"确保异步操作在调用另一个方法之前已完成在此背景下。任何实例成员都不能保证是线程安全
因此,我开始按照MS的建议使用异步方法。这涉及到在多个控制器操作中级联异步更改(实现async
在传播方式上被比作"僵尸病毒",我倾向于同意这一点)。
在注入的CurrentCandidate类中,以下异步方法仍然会出现错误:
public async Task<ApplicationUser> ApplicationUserAsync()
{
var applicationUser = await this._userManager.FindByIdAsync(HttpContext.Current.User.Identity.GetUserId());
return applicationUser;
}
这可能是因为HttpContext.Current.User.Identity.GetUserId()
在后台运行异步。
我假设,由于它是一个MS库,会有一个异步版本的GetUserId()
,但我找不到一个(或任何文档表明它存在)
我有什么选择?我受到了一位同事的一些压力,要求我完全放弃async
方法,但这只会在另一个地方导致同样的错误。
建议?
更新:
将两个调用分隔成单独的行,可以得到更清晰的画面。崩溃发生在FindByIdAsync()
:上
public async Task<ApplicationUser> ApplicationUserAsync()
{
var id = HttpContext.Current.User.Identity.GetUserId();
var applicationUser = await this._userManager.FindByIdAsync(id); <<<< crashes here
return applicationUser;
}
HttpContext.Current.User.Identity.GetUserId()
没有异步版本。GetUserId
未连接到EF或任何异步操作。以下是源代码:https://aspnetidentity.codeplex.com/SourceControl/latest#src/Microsoft.AspNet.Identity.Core/Extensions/IdentityExtensions.cs它所做的只是访问cookie数据并获取与UserId相关的声明值。
因此,您需要找到导致问题的其他操作。