簡體   English   中英

放置異步/等待的最佳實踐是什么?

[英]What is best practice for placing 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;
}

它們之間有什么區別(性能或其他)嗎? 最佳實踐是哪一種?

沒有明顯的區別

  • 在第一個,你是返回一個TaskPasswordSignInAsync分配result.Success = true ,然后等待任務

  • 在第二個步驟中,您正在等待PasswordSignInAsync Task ,如果沒有拋出,請分配結果result.Success = true

如果有的話,第二個版本更干凈,您可能不執行冗余分配而節省了一點IL 總而言之,我不認為會有任何性能差異,並且歸結為時尚感

SignInManager.PasswordSignInAsync中的某個SignInManager.PasswordSignInAsync正在等待。 在第一種方法中,您已經分配了結果,然后才真正知道登錄是否成功。 如果在此之后簽名失敗,那么您的作業將是徒勞的。

因此,要知道應該使用第一種方法還是使用后一種方法,取決於您期望該方法失敗的頻率。 通常,異常處理非常昂貴。 因此,僅應在預計它們很少發生的情況下才使用它們,尤其是在修復導致異常的問題所需的時間方面。

如果真是這樣,那么您可以同時使用兩種方法。 也許第一個是計算機速度更快一些。 如果您可以確保在構造之后您的JsonResult已經具有成功值,則可能會更快:

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

僅在catch塊中將其更改為false

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM