GetRolesAsync退出时没有跟踪



这是一个Blazor服务器应用程序。我使用序列号,但没有显示任何信息。我希望某个地方会出现异常,但代码只是存在而没有跟踪。

这是我尝试做的事情的简化版本。它在两个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());
}

您需要等待并将方法本身标记为async(确保在从何处调用它时等待它(。

在极少数情况下,您应该直接访问像这样的任务的Result,并且您需要显式结构化的代码来实现这一点。

最新更新