最初我在MVC Razor应用程序中出现以下错误时遇到问题(在完成加载页面之前单击某些选项两次):
第二个操作在此前一个上下文之前开始 异步操作完成。使用'await'确保任何 在调用另一个方法之前已完成异步操作 在这种背景下。任何实例成员都不能保证是线程 安全
所以我开始使用使用异步方法来处理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()
在幕后运行async 。
我假设,因为它是一个MS lib,会有一个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;
}
答案 0 :(得分:1)
HttpContext.Current.User.Identity.GetUserId()
没有异步版本。 GetUserId
未连接到EF或任何异步操作。以下是源代码:https://aspnetidentity.codeplex.com/SourceControl/latest#src/Microsoft.AspNet.Identity.Core/Extensions/IdentityExtensions.cs
它所做的只是进入cookie数据并获得与UserId相关的声明值。
因此,您需要找到导致您出现问题的其他操作。