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());
}

您需要等待并将方法本身标记为异步(确保在调用它的地方等待它)。

在极少数情况下,您应该像这样直接访问任务的结果,并且您需要明确结构化代码才能使其正常工作。