子タスクがキャンセルされ、親が完了しましたか?

異なる

子がアタッチされている場合の.netタスクの動作を理解しようとしています。

私は次のテストコードを持っています:

void Test()
{
    var tokenSource = new CancellationTokenSource();
    var token = tokenSource.Token;

    Task child = null;
    var parent = Task.Factory.StartNew(() =>
    {
        child = Task.Factory.StartNew(() =>
        {
            while (!token.IsCancellationRequested)
                Thread.Sleep(100);
            token.ThrowIfCancellationRequested();
        }, token, TaskCreationOptions.AttachedToParent, TaskScheduler.Default);
    }, token);

    Thread.Sleep(500);

    Debug.WriteLine("State of parent before cancel is {0}", parent.Status);
    Debug.WriteLine("State of child before cancel is {0}", child.Status);

    tokenSource.Cancel();
    Thread.Sleep(500);

    Debug.WriteLine("State of parent is {0}", parent.Status);
    Debug.WriteLine("State of child is {0}", child.Status);
}

この結果は次のとおりです。

State of parent before cancel is WaitingForChildrenToComplete
State of child before cancel is Running
A first chance exception of type 'System.OperationCanceledException' occurred in mscorlib.dll
State of parent is RanToCompletion
State of child is Canceled

Canceled両方のタスクがトークンを共有し、子がアタッチされている場合でも、親タスクの状態は明らかになりません

Canceledキャンセルが発生したときに親タスクを復帰状態するにはどうすればよいですか?

例外をスローすると、両方のタスクが戻りFaultedます。

Krumelur

これは、MSDNに記載されている予想される動作です。親タスクは、子タスク待機する必要があります(キャンセルセクションまでスクロールダウンします)。親タスクは、すべての良性の障害(キャンセルなど)を処理する必要があります。

親タスクを失敗させるには、トークンを待って渡すだけです。

Task child = null;
var parent = Task.Factory.StartNew(() =>
{
  child = Task.Factory.StartNew(() =>
  {
    while (!token.IsCancellationRequested) Thread.Sleep(100);
    token.ThrowIfCancellationRequested();
  }, token, TaskCreationOptions.AttachedToParent, TaskScheduler.Default);

  // This is the magic line.
  child.Wait(token);
}, token);

このコードを使用して、テストだけでなく生産的な処理を行う場合は、の代わりにデリゲートTask.Run()をサポートする簡略化されコードの使用も検討する必要がありますこの記事は非常に興味深いものです。asyncTask.Factory.StartNew()

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

タスクがキャンセルされました

分類Dev

タスクがキャンセルされましたXamarinException

分類Dev

Task.WhenAny-タスクがキャンセルされました

分類Dev

ウィンドウクローズが完了したかキャンセルされたかを知る方法は?

分類Dev

WebApiからファイルをダウンロードしようとしたときにタスクがキャンセルされました

分類Dev

ボタンがクリックされた場合、SetTimeout関数をキャンセルしますか?

分類Dev

DapperQueryAsyncメッセージの戻りタスクがキャンセルされました

分類Dev

HTTP Postリクエストがキャンセルされました

分類Dev

キャンセルが要求されるまで終了しないタスク

分類Dev

HttpClient-タスクはキャンセルされましたか?

分類Dev

キャンセルされたときに、継続チェーンのどのタスクが実行されていましたか?

分類Dev

「タスクがキャンセルされました」という例外を処理する

分類Dev

App Engine SearchAPI:java.util.concurrent.CancellationException:タスクがキャンセルされました

分類Dev

タスクをキャンセルすると、タスクが待機していた将来がキャンセルされます。それはどのように機能しますか?

分類Dev

サービスタスクを待機すると、TaskCanceledExceptionが発生します:タスクがキャンセルされました

分類Dev

キャンセルされた非同期タスクは、「タスクは破棄されましたが、保留中です」という結果になります

分類Dev

親タスクがキャンセルされると、NotOnRanToCompletion継続は実行されません

分類Dev

C#タスク-リンクされたキャンセルトークンが機能しない

分類Dev

axiosで検索:新しいキャラクターが表示されたら、以前のリクエストをキャンセルします

分類Dev

「インストールが完了しました」というメッセージが表示された後、スタックします

分類Dev

Informix-キャンセルされたセッションによって作成されたロックが原因でDBがロックされましたか?

分類Dev

Snowflakeクエリが強制終了されました:「SQLの実行がキャンセルされました」

分類Dev

エミュレータビルドがキャンセルされました

分類Dev

子からのscanfは、親がすでにスキャンしたものをスキャンします

分類Dev

SMTP送信メールがキャンセルされました

分類Dev

Xamarin:ビルドがキャンセルされました

分類Dev

QColorDialogがキャンセルされたかどうかを確認します

分類Dev

AsyncTaskがキャンセルされた場合、何かしますか?

分類Dev

子タスクの1つが例外をスローしたときに、子タスクをキャンセルします

Related 関連記事

  1. 1

    タスクがキャンセルされました

  2. 2

    タスクがキャンセルされましたXamarinException

  3. 3

    Task.WhenAny-タスクがキャンセルされました

  4. 4

    ウィンドウクローズが完了したかキャンセルされたかを知る方法は?

  5. 5

    WebApiからファイルをダウンロードしようとしたときにタスクがキャンセルされました

  6. 6

    ボタンがクリックされた場合、SetTimeout関数をキャンセルしますか?

  7. 7

    DapperQueryAsyncメッセージの戻りタスクがキャンセルされました

  8. 8

    HTTP Postリクエストがキャンセルされました

  9. 9

    キャンセルが要求されるまで終了しないタスク

  10. 10

    HttpClient-タスクはキャンセルされましたか?

  11. 11

    キャンセルされたときに、継続チェーンのどのタスクが実行されていましたか?

  12. 12

    「タスクがキャンセルされました」という例外を処理する

  13. 13

    App Engine SearchAPI:java.util.concurrent.CancellationException:タスクがキャンセルされました

  14. 14

    タスクをキャンセルすると、タスクが待機していた将来がキャンセルされます。それはどのように機能しますか?

  15. 15

    サービスタスクを待機すると、TaskCanceledExceptionが発生します:タスクがキャンセルされました

  16. 16

    キャンセルされた非同期タスクは、「タスクは破棄されましたが、保留中です」という結果になります

  17. 17

    親タスクがキャンセルされると、NotOnRanToCompletion継続は実行されません

  18. 18

    C#タスク-リンクされたキャンセルトークンが機能しない

  19. 19

    axiosで検索:新しいキャラクターが表示されたら、以前のリクエストをキャンセルします

  20. 20

    「インストールが完了しました」というメッセージが表示された後、スタックします

  21. 21

    Informix-キャンセルされたセッションによって作成されたロックが原因でDBがロックされましたか?

  22. 22

    Snowflakeクエリが強制終了されました:「SQLの実行がキャンセルされました」

  23. 23

    エミュレータビルドがキャンセルされました

  24. 24

    子からのscanfは、親がすでにスキャンしたものをスキャンします

  25. 25

    SMTP送信メールがキャンセルされました

  26. 26

    Xamarin:ビルドがキャンセルされました

  27. 27

    QColorDialogがキャンセルされたかどうかを確認します

  28. 28

    AsyncTaskがキャンセルされた場合、何かしますか?

  29. 29

    子タスクの1つが例外をスローしたときに、子タスクをキャンセルします

ホットタグ

アーカイブ