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>
この例では:
この改訂された例では、コアの機能と明確さを維持しながらコードが簡素化され、while
ループが ct.IsCancellationRequested
を直接チェックするようになり、ユーザーがわかりやすくするために Console.ReadKey()
の代わりに Console.ReadLine()
が使用されるようになりました。体験してください。
以上がAbort メソッドを使用する代わりに TPL タスクを正常にキャンセルするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。