这是Blazor Server应用程序。我使用Serilog,但未显示任何信息。我希望某个地方有异常,但是代码只是存在而没有任何痕迹。
这是我正在尝试做的简化版本。它在两个GetRolesAsync中的任意一个处随机退出:
// Both injected as Scoped at Startup.cs
private UserManager<IdentityUser> _userManager;
private RoleManager<IdentityRole> _roleManager;
public Task<IdentityUser> FetchIdentityUser()
{
// Two users:
var allUsers = _userManager.Users.ToList();
// Two roles:
var allRoles = _roleManager.Roles.ToList();
// Each user is attached to a single role in the db
// (checked via MysqlWorkbench)
var roleNames1 = _userManager.GetRolesAsync(allUsers.First()).Result; // <-- sometimes it exits here (no exception is thrown, no trace of what's going on ...)
var roleNames2 = _userManager.GetRolesAsync(allUsers.Last()).Result; // <-- ...and sometimes it exists here (no exception is thrown, no trace of what's goin on ...)
return Task.FromResult(allUsers.First());
}
这些是异步方法,您需要等待它们。
编辑(感谢Mark Gravell的评论):您可能会在这里看到同步上下文死锁,因为它们试图返回到调用线程。这也将更好地解释为什么您很难看到该错误!
public **async** Task<IdentityUser> FetchIdentityUser()
{
// Two users:
var allUsers = _userManager.Users.ToList();
// Two roles:
var allRoles = _roleManager.Roles.ToList();
// Each user is attached to a single role in the db
// (checked via MysqlWorkbench)
var roleNames1 = await _userManager.GetRolesAsync(allUsers.First()); // <-- sometimes it exits here (no exception is thrown, no trace of what's going on ...)
var roleNames2 = await _userManager.GetRolesAsync(allUsers.Last()); // <-- ...and sometimes it exists here (no exception is thrown, no trace of what's goin on ...)
return Task.FromResult(allUsers.First());
}
您需要awaits并将该方法本身标记为异步(确保在从那里调用它的地方等待它)。
在极少数情况下,应直接访问此类任务的结果,并且需要显式结构化的代码才能使其正常工作。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句