ホームページ >バックエンド開発 >C++ >C# でキャンセル時にタスクを適切に停止するにはどうすればよいですか?

C# でキャンセル時にタスクを適切に停止するにはどうすればよいですか?

DDD
DDDオリジナル
2025-01-26 12:36:10679ブラウズ

How Can I Properly Stop a Task Upon Cancellation in C#?

c#

でタスクのキャンセルを効果的に処理します

メソッドだけでは、実行中のタスクを停止しません。それは単にキャンセルを示すだけです。 キャンセルされたときにタスクがきれいに終了するようにするには、タスクのロジック内にキャンセル処理を積極的に組み込む必要があります。 CancellationToken.CancelNotification

タスクベースの非同期パターン(tap)

を活用します 最も効果的なアプローチは、TAPと

を一貫して使用することです。

CancellationToken

pass
  • キャンセルできるすべてのメソッドにパラメーターを組み込みます。 CancellationToken定期的なキャンセルチェック:CancellationTokenこれらのメソッドでは、
  • を使用してトークンのステータスを定期的に確認します。 キャンセルが検出された場合は、実行を停止するための例外を投げます。
  • cancellationToken.ThrowIfCancellationRequested()タップを使用した修正コードの例
  • この改善された例は、適切なキャンセル処理を示しています:

説明:

<code class="language-csharp">private async Task TryTask()
{
    using (var source = new CancellationTokenSource())
    {
        source.CancelAfter(TimeSpan.FromSeconds(1));
        try
        {
            Task<int> task = Task.Run(() => slowFunc(1, 2, source.Token), source.Token);
            int result = await task; // Await will re-throw any exceptions.
            Console.WriteLine($"Task completed successfully: {result}");
        }
        catch (OperationCanceledException)
        {
            Console.WriteLine("Task cancelled successfully.");
        }
    }
}

private int slowFunc(int a, int b, CancellationToken cancellationToken)
{
    for (int i = 0; i < 1000000; i++)
    {
        cancellationToken.ThrowIfCancellationRequested(); // Check for cancellation
        // ... your long-running operation ...
    }
    return a + b;
}</code>

ステートメント:例外が発生した場合でも、

が適切に廃棄されることを保証します。
  • block:usingは、でスローされたCancellationTokenSourceを処理し、きれいなキャンセル処理を提供します。
  • try-catch呼び出しは戦略的にループ内に配置され、頻繁にキャンセルチェックを可能にします。 これにより、キャンセルが要求された後の不必要な作業が防止されます OperationCanceledException この改訂されたアプローチは、キャ​​ンセルが要求されたときにタスクが迅速に停止することを保証し、リソースの漏れを防ぎ、全体的なアプリケーションの応答性を改善します。

以上がC# でキャンセル時にタスクを適切に停止するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。