[英]Who canceled my Task?
我的 C# 任務被取消了,但不是由我取消。 我沒有得到堆棧跟蹤,也無法弄清楚問題出在哪里。
我的任務調用如下所示:
var t = Task<Boolean>.Factory.StartNew(() =>
{
Boolean bOk = DoSomthingImportant();
return bOk;
}, TaskCreationOptions.AttachedToParent)
.ContinueWith<Boolean>((theTask) =>
{
var reason = theTask.IsCanceled ? "it was canceled" : "it faulted";
Debug.WriteLine("Error: Task ended because " + reason + ".");
... log the exception to one of my objects...
return false;
}, TaskContinuationOptions.NotOnRanToCompletion);
如果任務出現故障或被取消,我希望繼續任務運行,但如果運行正常則不運行。 永遠不會執行延續。
稍后,我的程序捕獲了一個封裝了 TaskCanceledException 的 AggregateException。
我與我的任務的另一個主要交互是調用 WaitAny(taskArray, timeout) 直到我沒有更多的任務要開始,然后在沒有超時的情況下調用 WaitAll 直到最后一個任務完成。
超時的 WaitAny 會導致取消嗎? 為什么我的延續沒有被調用?
這只是我第二次刷任務庫,所以我一無所知。
更新:
我發現了這個 SO 問題:如何將任務的取消狀態傳播到繼續任務。 我上面的代碼中的一個錯誤(但不是取消的原因)是我假設繼續任務的狀態與原始任務的狀態相同。 事實上,你必須做一些工作才能從另一個那里得到一個,正如另一篇文章所描述的那樣。
更新 2:
布賴恩:感謝文檔參考。 我曾在高低搜索過任務被取消的其他原因,但錯過了這些詞:
“如果您正在等待轉換到 Canceled 狀態的 Task,則會制造並拋出一個 Task(包裝在 AggregateException 中)。請注意,此異常表示成功取消而不是錯誤情況。因此,Task 的 Exception 屬性返回 null。 ”
您正在等待延續,並且由於原始任務運行完成,延續任務被取消。 文檔中介紹了此行為。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.