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

Mark13426

キャンセルサポートを追加するために、次のコードを改善したいと思います。基本的に、私がする必要があるのは、子が例外をスローしたら、すべての子と親タスクをキャンセルすることです。私は学習体験として以下のコードを書きました。AggregateExceptionすべての子供たちが終わって初めて見ることができますが、私はそれを望んでいません。

    static int GetSum()
    {
        var parent = Task<int>.Factory.StartNew(() =>
        {
            var children = new Task<int>[100];
            for (var i = 0; i < children.Length; i++)
            {
                var index = i;
                children[index] = Task<int>.Factory.StartNew(() =>
                {
                    var randomNumber = new Random().Next(5);
                    if (randomNumber == 0)
                    {
                        throw new Exception();
                    }

                    return randomNumber;
                }, TaskCreationOptions.AttachedToParent);
            }

            Task.WaitAll();
            Console.WriteLine("Children finished");
            return children.Sum(t => t.Result);
        });

        parent.Wait();
        Console.WriteLine("Parent finished");
        return parent.Result;
    }

方法はわかりませんが、次のものを使用する必要があると思います。

var source = new CancellationTokenSource();
var token = source.Token;
ブラヒムカメル

Task.WaitAnyWaitAllの代わりに使用して、AgregateExceptionが次のようにスローされたら、トークンに対してキャンセル要求を行うことができます。

static int GetSum()
    {
        var tokenSource = new CancellationTokenSource();
        var token = tokenSource.Token;
        var parent = Task<int>.Factory.StartNew(() =>
        {
            var children = new Task<int>[100];
            for (var i = 0; i < children.Length; i++)
            {
                var index = i;
                children[index] = Task<int>.Factory.StartNew(() =>
                {
                    for (int j = 0; j < 100000; j++)
                    {


                    if (!token.IsCancellationRequested)
                    {


                        var randomNumber = new Random().Next(5);
                        if (randomNumber == 0)
                        {
                            throw new Exception();
                        }

                        return randomNumber;
                    }
                    else
                    {
                        token.ThrowIfCancellationRequested();
                    }
                    }
                    return 0;
                }
                , token);
            }
            try
            {
                Task.WaitAny(children);
            }
            catch (AggregateException ae)
            {
                tokenSource.Cancel();
                ae.Handle((task) =>
                    {
                        Console.WriteLine("Cancel all others child tasks  requested ");
                        return true;
                    });
            }

            Console.WriteLine("Children finished");
            return children.Sum(t => t.Result);
        });

        try
        {
            parent.Wait();
        }
        catch (AggregateException aex)
        {
            aex.Handle((task) =>
            {
                Console.WriteLine("Cancel child work  done ");
                return true;
            });              
        }

        Console.WriteLine("Parent finished");
        return parent.Result;
    }

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

並列タスクが例外をスローした場合のタスクのキャンセル

分類Dev

RxJS:他のアクティブなリクエストの1つがエラーをスローしたときに、mergeMapオペレーターが他のアクティブなリクエストをキャンセルする

分類Dev

Asyncio:タスクの1つが例外をスローしたときにすべてのタスクを終了します

分類Dev

セロリタスクにdjangoキャンバスを使用して2つのグループ並列タスクを実行できますか

分類Dev

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

分類Dev

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

分類Dev

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

分類Dev

React | 親が「アンチパターン」でなくてもクリックしたときに、子のテキスト領域に焦点を合わせます

分類Dev

子供を動かしながらWPFスクロールキャンバスがスタッターを引き起こす

分類Dev

C#でParallel.Foreachを実行しているときに、ブール値のインクルードタスクが例外をキャンセルしました

分類Dev

.NET Core 3.0でロールをシードしようとすると、タスクの取得がキャンセルされましたエラー

分類Dev

CTRPを使用しているときに、親コンストラクターUBの子属性にアクセスしてアクセスしていますか?

分類Dev

Flutter:子がオーバーフローしたときにスタックのサイズを変更する

分類Dev

Windows Phone 8は、戻るキーを押したときに非同期タスクをキャンセルする必要があります

分類Dev

Xcode UIテスト-UIテストの失敗-検索フィールドの[キャンセル]ボタンをタップすると、(AXアクションによって)表示にスクロールできませんでした

分類Dev

子プロセスが失敗したときにフローを中断する親スレッドでキャッチされた例外

分類Dev

Swiftが識別子Cellを持つセルをデキューできない-識別子のペン先またはクラスを登録するか、ストーリーボードにプロトタイプセルを接続する必要があります

分類Dev

子要素がクリックされたときに要素を取得して上にスクロールします

分類Dev

VisualBasicの1つのボタンにテキストボックスの内容を記載した電子メールを送信する

分類Dev

WhenAllがTaskWasCancelledをスローしている間に別のタスクをキャンセルする

分類Dev

WizardsPage1から2を介して次へとナビゲートするときに、プログレスバーのキャンセルボタンがクリックされた場合にユーザーを同じページにとどまらせるにはどうすればよいですか?

分類Dev

フォークする前にプロセスにカスタムシグナルハンドラーを登録した場合、後続の子プロセスにもカスタムシグナルハンドラーが登録されますか?

分類Dev

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

分類Dev

sharepoint 2013ワークフローは、新しいタスクが作成されたときに電子メールを送信します

分類Dev

Python 2.7:最初にアクセスしたときにローカルストレージのインスタンス化をスレッド化しますか?

分類Dev

jQuery-ロード時にボタンスタイルを追加し、他の人がクリックされたときにスタイルを削除します。

分類Dev

Stripeでは、ユーザーが電子メールで受信したリンクをクリックしたときにスタンドアロンの支払いを行う方法はありますか?

分類Dev

識別子TodoItemRowでセルをデキューできない-識別子のペン先またはクラスを登録するか、ストーリーボードのプロトタイプセルを接続する必要があります。

分類Dev

識別子を使用してセルをデキューできない場合は、識別子のペン先またはクラスを登録するか、ストーリーボードでプロトタイプセルを接続する必要があります

Related 関連記事

  1. 1

    並列タスクが例外をスローした場合のタスクのキャンセル

  2. 2

    RxJS:他のアクティブなリクエストの1つがエラーをスローしたときに、mergeMapオペレーターが他のアクティブなリクエストをキャンセルする

  3. 3

    Asyncio:タスクの1つが例外をスローしたときにすべてのタスクを終了します

  4. 4

    セロリタスクにdjangoキャンバスを使用して2つのグループ並列タスクを実行できますか

  5. 5

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

  6. 6

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

  7. 7

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

  8. 8

    React | 親が「アンチパターン」でなくてもクリックしたときに、子のテキスト領域に焦点を合わせます

  9. 9

    子供を動かしながらWPFスクロールキャンバスがスタッターを引き起こす

  10. 10

    C#でParallel.Foreachを実行しているときに、ブール値のインクルードタスクが例外をキャンセルしました

  11. 11

    .NET Core 3.0でロールをシードしようとすると、タスクの取得がキャンセルされましたエラー

  12. 12

    CTRPを使用しているときに、親コンストラクターUBの子属性にアクセスしてアクセスしていますか?

  13. 13

    Flutter:子がオーバーフローしたときにスタックのサイズを変更する

  14. 14

    Windows Phone 8は、戻るキーを押したときに非同期タスクをキャンセルする必要があります

  15. 15

    Xcode UIテスト-UIテストの失敗-検索フィールドの[キャンセル]ボタンをタップすると、(AXアクションによって)表示にスクロールできませんでした

  16. 16

    子プロセスが失敗したときにフローを中断する親スレッドでキャッチされた例外

  17. 17

    Swiftが識別子Cellを持つセルをデキューできない-識別子のペン先またはクラスを登録するか、ストーリーボードにプロトタイプセルを接続する必要があります

  18. 18

    子要素がクリックされたときに要素を取得して上にスクロールします

  19. 19

    VisualBasicの1つのボタンにテキストボックスの内容を記載した電子メールを送信する

  20. 20

    WhenAllがTaskWasCancelledをスローしている間に別のタスクをキャンセルする

  21. 21

    WizardsPage1から2を介して次へとナビゲートするときに、プログレスバーのキャンセルボタンがクリックされた場合にユーザーを同じページにとどまらせるにはどうすればよいですか?

  22. 22

    フォークする前にプロセスにカスタムシグナルハンドラーを登録した場合、後続の子プロセスにもカスタムシグナルハンドラーが登録されますか?

  23. 23

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

  24. 24

    sharepoint 2013ワークフローは、新しいタスクが作成されたときに電子メールを送信します

  25. 25

    Python 2.7:最初にアクセスしたときにローカルストレージのインスタンス化をスレッド化しますか?

  26. 26

    jQuery-ロード時にボタンスタイルを追加し、他の人がクリックされたときにスタイルを削除します。

  27. 27

    Stripeでは、ユーザーが電子メールで受信したリンクをクリックしたときにスタンドアロンの支払いを行う方法はありますか?

  28. 28

    識別子TodoItemRowでセルをデキューできない-識別子のペン先またはクラスを登録するか、ストーリーボードのプロトタイプセルを接続する必要があります。

  29. 29

    識別子を使用してセルをデキューできない場合は、識別子のペン先またはクラスを登録するか、ストーリーボードでプロトタイプセルを接続する必要があります

ホットタグ

アーカイブ