Task.WhenAllで例外が発生した場合にキャンセルして例外を発生させる方法は?

フェルナンドシルバ

Task.WhenAllを使用して複数のタスクを待っています。それらの1つが例外を生成した場合、Task.WhenAll(または複数のタスクを待機する他の方法)で他のタスクをすぐにキャンセルして例外を発生させたいと思います。

出来ますか?

前もって感謝します

スコットチェンバレン

キャンセルは協調的でありWhenAll、スレッドをキャンセルすることできませんが、すべてのスレッドを渡しCancellationToken、例外が発生したときにトークンを起動することができます。

CancellationTokenSource cts = new CancellationTokenSource();

var task1 = Func1Async(cts.Token);
task1.ContinueWith(task => cts.Cancel(), cts.Token, TaskContinuationOptions.OnlyOnFaulted, TaskScheduler.Default);
var task2 = Func2Async(cts.Token);
task2.ContinueWith(task => cts.Cancel(), cts.Token, TaskContinuationOptions.OnlyOnFaulted, TaskScheduler.Default);
var task3 = Func3Async(cts.Token);
task3.ContinueWith(task => cts.Cancel(), cts.Token, TaskContinuationOptions.OnlyOnFaulted, TaskScheduler.Default);

await Task.WhenAll(task1, task2, task3);

メソッド内からtoken.ThrowIfCancellationRequested()、トークンをチェックしてタスクをキャンセルするために関数内に配置する必要があります

public async Task Func1Async(CancellationToken token)
{
    foreach(var item in GetItems1())
    {
         await item.ProcessAsync(token);
         token.ThrowIfCancellationRequested();
    }
}

注:拡張メソッドを作成することで、コードを少しクリーンアップできます。

public static class ExtensionMethods
{
    public Task CancelOnFaulted(this Task task, CancellationTokenSource cts)
    {
        task.ContinueWith(task => cts.Cancel(), cts.Token, taskContinuationOptions.OnlyOnFaulted, TaskScheduler.Default);
        return task;
    }

    public Task<T> CancelOnFaulted<T>(this Task<T> task, CancellationTokenSource cts)
    {
        task.ContinueWith(task => cts.Cancel(), cts.Token, taskContinuationOptions.OnlyOnFaulted, TaskScheduler.Default);
        return task;
    }
}

これにより、コードは次のようになります。

CancellationTokenSource cts = new CancellationTokenSource();

var task1 = Func1Async(cts.Token).CancelOnFaulted(cts);
var task2 = Func2Async(cts.Token).CancelOnFaulted(cts);
var task3 = Func3Async(cts.Token).CancelOnFaulted(cts);

await Task.WhenAll(task1, task2, task3);

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

例外が発生した場合にTask.WaitAll()を中断させる方法は?

分類Dev

例外が発生した場合はtask.LoopingCallを停止します

分類Dev

Task.WhenAllを適切にキャンセルし、最初の例外をスローする方法は?

分類Dev

Task <T>を使用してイベントを発生させ、イベントが終了するのを待つ方法

分類Dev

Task <T>を使用してイベントを発生させ、イベントが終了するのを待つ方法

分類Dev

コルーチンがasyncioで例外を発生させた場合、ループをシャットダウンしてエラーを出力する方法は?

分類Dev

すべてのコルーチンがすでにCouroutineExceptionHandlerでラップされている場合に、「ジョブがキャンセルされた」例外が発生した場所を特定するにはどうすればよいですか?

分類Dev

例外をキャッチしてログに記録する(発生させない)場合、発生する例外はKeyboardInterruptだけですか?

分類Dev

Task.WhenAllでは、例外をすぐにキャッチすることはできません。

分類Dev

Task.WhenAllは、例外の場合にすべてのタスクを待機します

分類Dev

イベントが発生した後にTask.Delay()をリセットするにはどうすればよいですか?

分類Dev

Camunda外部クライアント:TASK / CLIENT-02002リクエストの接続を確立中に例外が発生しました

分類Dev

.Net Task.WhenAll()中にスローされたすべての例外を報告する方法は?

分類Dev

Task.Runでawaitを使用すると、「破棄されたクロージャへのアクセス」エラーが発生しますか?

分類Dev

std :: packaged_taskを使用してCAsyncSocket-Detach-socketタスクをキューに入れると、静的メソッドから非静的Attachが呼び出されたときにコンパイルエラーが発生します

分類Dev

例外が発生した場合、Flask-SQLAlchemyがセッションを自動的にロールバックする方法を教えてください。

分類Dev

スクリプトが失敗した場合に例外を発生させる

分類Dev

スクリプトが失敗した場合に例外を発生させる

分類Dev

例外が発生した場合にHttpActionExecutedContextでJSON本文を読み取る方法

分類Dev

例外を渡し、例外が返されない場合にエラーを発生させる方法

分類Dev

ループ中に例外が発生した場合:例外を渡す前に中間結果を返す方法は?

分類Dev

例外が発生した場合にActionBlockを実行し続ける方法

分類Dev

task.delayを例外なくキャンセルしますか、それとも例外を使用してフローを制御しますか?

分類Dev

別の関数によって「初期化」される前に変数にアクセスした場合は、例外を発生させます

分類Dev

CancellationTokenをキャンセルすると、CancellationToken例外が発生しますか?

分類Dev

抽象クラスの属性名が間違って入力された場合に例外を発生させる方法

分類Dev

ハンドラーで例外が発生した場合、メッセージはヘッダーで定義されたエラーチャネルにルーティングできません

分類Dev

例外が発生した場合にJSONファイルを削除する

分類Dev

smtplib pythonを介して例外が発生した場合、電子メールを送信できません

Related 関連記事

  1. 1

    例外が発生した場合にTask.WaitAll()を中断させる方法は?

  2. 2

    例外が発生した場合はtask.LoopingCallを停止します

  3. 3

    Task.WhenAllを適切にキャンセルし、最初の例外をスローする方法は?

  4. 4

    Task <T>を使用してイベントを発生させ、イベントが終了するのを待つ方法

  5. 5

    Task <T>を使用してイベントを発生させ、イベントが終了するのを待つ方法

  6. 6

    コルーチンがasyncioで例外を発生させた場合、ループをシャットダウンしてエラーを出力する方法は?

  7. 7

    すべてのコルーチンがすでにCouroutineExceptionHandlerでラップされている場合に、「ジョブがキャンセルされた」例外が発生した場所を特定するにはどうすればよいですか?

  8. 8

    例外をキャッチしてログに記録する(発生させない)場合、発生する例外はKeyboardInterruptだけですか?

  9. 9

    Task.WhenAllでは、例外をすぐにキャッチすることはできません。

  10. 10

    Task.WhenAllは、例外の場合にすべてのタスクを待機します

  11. 11

    イベントが発生した後にTask.Delay()をリセットするにはどうすればよいですか?

  12. 12

    Camunda外部クライアント:TASK / CLIENT-02002リクエストの接続を確立中に例外が発生しました

  13. 13

    .Net Task.WhenAll()中にスローされたすべての例外を報告する方法は?

  14. 14

    Task.Runでawaitを使用すると、「破棄されたクロージャへのアクセス」エラーが発生しますか?

  15. 15

    std :: packaged_taskを使用してCAsyncSocket-Detach-socketタスクをキューに入れると、静的メソッドから非静的Attachが呼び出されたときにコンパイルエラーが発生します

  16. 16

    例外が発生した場合、Flask-SQLAlchemyがセッションを自動的にロールバックする方法を教えてください。

  17. 17

    スクリプトが失敗した場合に例外を発生させる

  18. 18

    スクリプトが失敗した場合に例外を発生させる

  19. 19

    例外が発生した場合にHttpActionExecutedContextでJSON本文を読み取る方法

  20. 20

    例外を渡し、例外が返されない場合にエラーを発生させる方法

  21. 21

    ループ中に例外が発生した場合:例外を渡す前に中間結果を返す方法は?

  22. 22

    例外が発生した場合にActionBlockを実行し続ける方法

  23. 23

    task.delayを例外なくキャンセルしますか、それとも例外を使用してフローを制御しますか?

  24. 24

    別の関数によって「初期化」される前に変数にアクセスした場合は、例外を発生させます

  25. 25

    CancellationTokenをキャンセルすると、CancellationToken例外が発生しますか?

  26. 26

    抽象クラスの属性名が間違って入力された場合に例外を発生させる方法

  27. 27

    ハンドラーで例外が発生した場合、メッセージはヘッダーで定義されたエラーチャネルにルーティングできません

  28. 28

    例外が発生した場合にJSONファイルを削除する

  29. 29

    smtplib pythonを介して例外が発生した場合、電子メールを送信できません

ホットタグ

アーカイブ