簡體   English   中英

為什么會調用 OnlyOnCanceled 延續?

[英]Why does the OnlyOnCanceled continuation get called?

當調用await RunAsync(); 在下面的代碼中,我希望繼續使用TaskContinuationOptions.OnlyRanToCompletion繼續運行,但是調用OnlyOnCanceled繼續(產生調試輸出“任務取消”)。

為什么?

private static async Task RunAsync()
{
    try
    {
        await Task.Run(() => DoWork())
            .ContinueWith(
                (t) =>
                {
                    if (t?.Exception != null)
                    {
                        throw t.Exception;
                    }
                }, TaskContinuationOptions.OnlyOnFaulted
            ).ContinueWith(
                (t) =>
                {
                    Debug.WriteLine("Task canceled.");
                }, TaskContinuationOptions.OnlyOnCanceled
            ).ContinueWith(
                (t) =>
                {
                    Debug.WriteLine("Task completed.");
                }, TaskContinuationOptions.OnlyOnRanToCompletion);

    }
    catch (Exception ex)
    {
        Debug.WriteLine(ex.Message);
    }
}

private static void DoWork()
{
    Thread.Sleep(1000);

}

你綁定了你的延續錯誤。

您不是向“主要”任務添加三個延續,而是向延續添加延續。 當沒有錯誤的主要任務完成時, OnlyOnFaulted延續被取消,這會觸發OnlyOnCanceled錯誤地連接到延續OnlyOnFaulted延續,而不是主要任務。 然后是最好的部分 - 這意味着第二個延續正確完成,並且由於您將最后一個延續連接到第二個延續,因此最終延續也運行,因此完整輸出是“任務已取消。任務已完成”。 :)

不過,您期望的正確輸出並不明顯。 你為什么首先使用延續? await為您處理它比您手動做的要好得多。 混合使用awaitContinueWith很少是一個好主意 :) 您是否正在嘗試await主要任務(在拋出異常時失敗)? 還是其中一種延續? 或者只是OnlyOnRanToCompletion延續(這就是你現在正在做的,它永遠不會像你期望的那樣工作)? 如果這種延續永遠沒有機會運行怎么辦?

暫無
暫無

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

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