最初,我在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 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;
}
最佳答案
HttpContext.Current.User.Identity.GetUserId()
没有异步版本。 GetUserId
未连接到EF或任何异步操作。这是源代码:https://aspnetidentity.codeplex.com/SourceControl/latest#src/Microsoft.AspNet.Identity.Core/Extensions/IdentityExtensions.cs
它所做的只是进入cookie数据并获取与UserId相关的声明值。
因此,您需要找到其他引起问题的操作。
关于c# - Identity Framework中是否有GetUserIdAsync()?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28830266/