ホームページ > バックエンド開発 > C++ > Abort メソッドを使用する代わりに TPL タスクを正常にキャンセルするにはどうすればよいですか?

Abort メソッドを使用する代わりに TPL タスクを正常にキャンセルするにはどうすればよいですか?

Barbara Streisand
リリース: 2025-01-25 02:33:09
オリジナル
1002 人が閲覧しました

How Can I Gracefully Cancel TPL Tasks Instead of Using the Abort Method?

TPL タスクを正常にキャンセルします

スレッドベースのプログラミングでは、環境が変化した場合、またはスレッドを早期に終了する必要がある場合、タスクをキャンセルする必要がある場合があります。ただし、Abort メソッドを使用してスレッドが終了された場合、System.Threading.Task インスタンスは自動的に中止されません。この記事では、タスクに中止シグナルを直接送信できない理由を検討し、キャンセル トークンを使用した代替ソリューションを提供します。

Abort メソッドを使用してタスクをキャンセルすることは、予期しない動作やデータ破損の可能性を引き起こす可能性があるため、お勧めできません。推奨されるアプローチは、キャ​​ンセル トークンを使用することです。

以下はキャンセル トークンの実装を示しています:

<code class="language-csharp">class Program
{
    static void Main()
    {
        var cts = new CancellationTokenSource();
        CancellationToken ct = cts.Token;

        // 创建一个持续执行某些操作的任务
        Task.Factory.StartNew(() =>
        {
            while (!ct.IsCancellationRequested)
            {
                // 模拟繁重的工作
                Thread.Sleep(100);
            }
            Console.WriteLine("任务已取消");
        }, ct);

        // 模拟等待任务启动一小段时间
        Thread.Sleep(3000);

        // 发送取消请求
        cts.Cancel();

        // 主线程阻塞,等待用户按下按键
        Console.ReadKey();
    }
}</code>
ログイン後にコピー

この例では:

  • キャンセル トークン ソース (cts) とそのトークン (ct) を作成しました。
  • タスクを作成し、キャンセル トークンを使用するように構成します。
  • タスク内では、継続的なループがシミュレートされた重いワークロードを実行し、キャンセル要求を定期的にチェックします。
  • タスクが開始されてから少しの間、キャンセル トークン ソースを介してキャンセル シグナルを送信します。
  • メインスレッドは一時停止され、ユーザー入力を待機しているため、タスクの動作と出力を観察できます。

この改訂された例では、コアの機能と明確さを維持しながらコードが簡素化され、while ループが ct.IsCancellationRequested を直接チェックするようになり、ユーザーがわかりやすくするために Console.ReadKey() の代わりに Console.ReadLine() が使用されるようになりました。体験してください。

以上がAbort メソッドを使用する代わりに TPL タスクを正常にキャンセルするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート