【问题标题】:How to check user with FindByNameAsync and FindByIdAsync both at the same time如何同时使用 FindByNameAsync 和 FindByIdAsync 检查用户
【发布时间】:2021-01-11 10:37:06
【问题描述】:

如何在此用户变量中同时检查 id && username 以将其作为第一个参数传递到 CheckPasswordSignInAsync 方法中,谢谢

        var user = await _userManager.FindByNameAsync(userForLoginDto.UserName);
                    await _userManager.FindByIdAsync(userForLoginDto.Id);

【问题讨论】:

  • 我不明白该怎么做?

标签: c# webapi


【解决方案1】:

将您要并行运行的任务传递给Task.WhenAny,然后获取第一个完成任务的结果:

var completedTask = await Task.WhenAny(
     FindByNameAsync(userForLoginDto.UserName),
     FindbyIdAsync(userForLoginDto.Id));
var user = await completedTask;

注意:通常您不应该对同一数据库中的相同数据运行并行搜索。按主键搜索应该是最快的。

如果要检查用户名是否被其他用户占用,则只需按用户名搜索并检查返回用户的id(如果有)。

更新:如果这些搜索是独立的,并且您只想并行运行它们并获得所有结果,请使用 Task.WhenAll - 当所有任务完成后,它将返回数组或结果:

var users = await Task.WhenAll(
     FindByNameAsync(userForLoginDto.UserName),
     FindbyIdAsync(userForLoginDto.Id));

【讨论】:

  • 如果第一次搜索更快但没有返回匹配会发生什么?
  • @mjwills 好点 - 正如我在注释中提到的,这取决于这两个搜索是否寻找相同的数据。这完全取决于用例。我再补充一条
  • var completedTask = await Task.WhenAny(_userManager.FindByNameAsync(userForLoginDto.UserName), _userManager.FindByIdAsync(userForLoginDto.Id)); var user = 等待完成任务; vr 结果 = 等待 _signInManager.CheckPasswordSignInAsync(user, userForLoginDto.Password, false);我发现了新错误 System.InvalidOperationException:在前一个操作完成之前,在此上下文上启动了第二个操作。这通常是由使用相同 DbContext 实例的不同线程引起的。有关如何避免 DbContext 的线程问题的更多信息
  • @mohamedhemeda 这是一个不同的问题。您可以从更改 dbcontext stackoverflow.com/questions/48767910 的生命周期开始,或者只是发布新问题
猜你喜欢
  • 2016-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多