9

私の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はキャンセルを引き起こす可能性がありますか?なぜ私の継続が呼び出されなかったのですか?

これは、タスクライブラリを使用した2番目のブラシにすぎないため、わかりません。

アップデート:

私はこのSOの質問を見つけました:タスクのキャンセル済みステータスを継続タスクに伝播する方法。上記のコードの1つのエラー(キャンセルの原因ではありません)は、継続タスクのステータスが元のタスクのステータスと同じであると想定したことです。実際、他の投稿で説明されているように、一方を他方から取得するには、いくつかの作業を行う必要があります。

更新2:

ブライアン:ドキュメンテーションリファレンスをありがとう。タスクがキャンセルされる別の原因を高低で検索しましたが、次の単語を見逃しました。

「キャンセル状態に移行するタスクを待機している場合、タスク(AggregateExceptionにラップされている)が生成されてスローされます。この例外は、障害のある状況ではなく、キャンセルが成功したことを示します。したがって、タスクのExceptionプロパティはnullを返します。 「」

4

1 に答える 1

15

継続を待っていますが、元のタスクが実行されて完了したため、継続タスクはキャンセルされました。この動作については、ドキュメントで説明されています。

于 2013-01-28T22:12:12.113 に答える