簡體   English   中英

誰取消了我的任務?

[英]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.

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