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

时间:2018-07-25 07:51:54

标签: c# asynchronous async-await

我有以下代码:

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 个答案:

答案 0 :(得分:4)

没有明显的差异

  • 首先,您是从Task返回PasswordSignInAsync并分配了result.Success = true,然后等待任务

  • 第二次,您正在等待PasswordSignInAsync Task,如果没有抛出,请分配result.Success = true

如果有的话,第二个版本更干净,您可能不执行冗余分配而节省了IL。总而言之,我认为不会有任何性能差异,并且归结为时尚感

答案 1 :(得分:1)

SignInManager.PasswordSignInAsync中的某个地方正在等待。在第一种方法中,您已经分配了结果,然后才真正知道登录是否成功。如果此后签名失败,那么您的作业将是徒劳的。

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

如果是这种情况,则可以使用两种方法。也许第一个是计算机速度更快一些。如果您可以确保在构造之后,您的JsonResult已经具有成功值,那么它甚至可能会更快:

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

仅在catch块中将其更改为false

相关问题