[英]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
為您處理它比您手動做的要好得多。 混合使用await
和ContinueWith
很少是一個好主意 :) 您是否正在嘗試await
主要任務(在拋出異常時失敗)? 還是其中一種延續? 或者只是OnlyOnRanToCompletion
延續(這就是你現在正在做的,它永遠不會像你期望的那樣工作)? 如果這種延續永遠沒有機會運行怎么辦?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.