GetRolesAsync 退出无影无踪
GetRolesAsync exits without a trace
它是一个 Blazor 服务器应用程序。我使用 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 的评论):您可能在这里看到的是同步上下文死锁,因为它们试图 return 调用线。这也能更好地解释为什么您看不到错误!
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());
}
您需要等待并将方法本身标记为异步(确保在调用它的地方等待它)。
在极少数情况下,您应该像这样直接访问任务的结果,并且您需要明确结构化代码才能使其正常工作。
它是一个 Blazor 服务器应用程序。我使用 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 的评论):您可能在这里看到的是同步上下文死锁,因为它们试图 return 调用线。这也能更好地解释为什么您看不到错误!
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());
}
您需要等待并将方法本身标记为异步(确保在调用它的地方等待它)。
在极少数情况下,您应该像这样直接访问任务的结果,并且您需要明确结构化代码才能使其正常工作。