我有以下代码:
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;
}
它们之间是否有区别(性能或其他)?哪个是最佳实践?
答案 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