C# 放置async/await的最佳实践是什么?

C# 放置async/await的最佳实践是什么?,c#,asynchronous,async-await,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

我有以下代码:

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;
}
公共异步任务登录(LoginDTO LoginDTO)
{
var result=新的JsonResult();
尝试
{
var signIn=SignInManager.PasswordSignInAsync(loginDTO.Username、loginDTO.Password、loginDTO.ispersist、false);//或任何异步方法。
结果:成功=正确;
等待签名;
}
捕获(例外情况除外)
{
结果:成功=错误;
结果:误差=ex;
}
返回结果;
}
我可以这样改变它:

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;
}
公共异步任务登录(LoginDTO LoginDTO)
{
var result=新的JsonResult();
尝试
{
等待SignInManager.PasswordSignInAsync(loginDTO.Username、loginDTO.Password、loginDTO.IsPersistent、false);//或任何异步方法。
结果:成功=正确;
}
捕获(例外情况除外)
{
结果:成功=错误;
结果:误差=ex;
}
返回结果;
}

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

没有明显的区别

  • 首先,您从
    PasswordSignInAsync
    assigning
    result.Success=true
    返回一个
    任务,然后等待该任务

  • 在第二种情况下,您正在等待
    密码签名同步任务
    任务
    ,如果它没有抛出,则分配
    结果。成功=真


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

  • 首先,您从
    PasswordSignInAsync
    assigning
    result.Success=true
    返回一个
    任务,然后等待该任务

  • 在第二种情况下,您正在等待
    密码签名同步任务
    任务
    ,如果它没有抛出,则分配
    结果。成功=真


如果有什么区别的话,第二个版本更干净,您可以通过不执行冗余分配来节省一点点的
IL
。总而言之,我不期望有任何性能差异,这可以归结为
SignInManager中的时尚感。PasswordSignInAsync
是一种等待。在第一种方法中,在您真正知道登录是否成功之前,您已经分配了结果。如果你在那之后签名失败,你的任务将是徒劳的

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

如果是这样,那么您可以使用这两种方法。也许第一个原因是电脑的滴答声快了一些。如果您确保在构建之后,您的JsonResult已经具有成功价值,那么If可能会更快:

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

仅在catch块中的
SignInManager中的某个地方将其更改为false。PasswordSignInAsync
是一个等待。在第一种方法中,在您真正知道登录是否成功之前,您已经分配了结果。如果你在那之后签名失败,你的任务将是徒劳的

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

如果是这样,那么您可以使用这两种方法。也许第一个原因是电脑的滴答声快了一些。如果您确保在构建之后,您的JsonResult已经具有成功价值,那么If可能会更快:

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

只需在catch块中将其更改为false

实际上没有任何区别。PasswordSignInAsync不应该返回布尔值而不是抛出异常吗?如果您抛出异常not show想要捕获与无法登录相关的特定异常,那么现在您可以捕获所有异常。您衡量了性能吗?您必须多久登录一次,这很重要?@PepitoSh我的问题不是关于登录,我指的是任何异步方法。在第一个示例中,您在结果实际成功之前将其设置为成功。虽然这两个例子没有太大区别,但就个人而言,我会使用第二个例子-逻辑是正确的,如果您决定删除try/catch,它将起作用。实际上没有任何区别。PasswordSignInAsync不应该返回布尔值而不是抛出异常吗?如果您抛出异常not show想要捕获与无法登录相关的特定异常,那么现在您可以捕获所有异常。您衡量了性能吗?您必须多久登录一次,这很重要?@PepitoSh我的问题不是关于登录,我指的是任何异步方法。在第一个示例中,您在结果实际成功之前将其设置为成功。虽然这两个例子没有太大区别,但就个人而言,我会使用第二个例子——逻辑是正确的,如果您决定删除try/catch,它将起作用。