代码之家  ›  专栏  ›  技术社区  ›  Mohamad Shiralizadeh muhamad ridwan

放置异步/等待的最佳实践是什么?

  •  1
  • Mohamad Shiralizadeh muhamad ridwan  · 技术社区  · 6 年前

    我有以下代码:

    public async Task<JsonResult<LoginStatus>> Login(LoginDTO loginDTO)
    {
        var result = new JsonResult<LoginStatus>();
    
        try
        {
            var signIn = SignInManager.PasswordSignInAsync(loginDTO.Username, loginDTO.Password, loginDTO.IsPersistent, false); // or any async method.
    
            result.Success = true;
    
            await signIn;
        }
        catch (Exception ex)
        {
            result.Success = false;
            result.Error = ex;
        }
    
        return result;
    }
    

    我可以这样改变它:

    public async Task<JsonResult<LoginStatus>> Login(LoginDTO loginDTO)
    {
        var result = new JsonResult<LoginStatus>();
    
        try
        {
            await SignInManager.PasswordSignInAsync(loginDTO.Username, loginDTO.Password, loginDTO.IsPersistent, false); // or any async method.
    
            result.Success = true;
        }
        catch (Exception ex)
        {
            result.Success = false;
            result.Error = ex;
        }
    
        return result;
    }
    

    他们之间有什么区别(表现或其他方面)?哪一个是最佳实践?

    2 回复  |  直到 6 年前
        1
  •  4
  •   TheGeneral    6 年前

    没有明显的区别

    • 首先,您将返回 Task PasswordSignInAsync 指派 result.Success = true 然后等待任务

    • 在第二个阶段,您正在等待 密码签名同步 任务 如果它不抛出你指定的 result.success=真

    如果有什么区别的话,第二个版本更干净,而且您节省了一点点 IL 可能不执行冗余分配。总之,我不希望有任何性能上的差异,归根结底就是时尚感

        2
  •  1
  •   Harald Coppoolse    6 年前

    在里面的某个地方 SignInManager.PasswordSignInAsync 正在等待。在第一个方法中,在真正知道登录是否成功之前,您已经分配了结果。如果你在那之后签字不通过,你的任务将是无效的。

    因此,要知道是应该使用第一个方法还是使用后一个方法,取决于您希望此方法失败的频率。通常,异常处理非常昂贵。因此,只有在预期很少发生的情况下才应使用它们,特别是在修复导致异常的问题所需的时间方面。

    如果是这样,那么您可以同时使用这两种方法。也许第一个是几台电脑的滴答声更快。如果您能确保在构建之后,JSONResult已经具有成功价值,那么它可能更快:

    var result = new JsonResult() {Success = true;}
    

    只在catch块中将其更改为false