ベスト プラクティス: cancelTokenSource を正しく処理する
CancellationTokenSource
クラスは解放できますが、クラスを解放する正しい方法は開発者を混乱させることがよくあります。この記事では、このクラスを効果的にリリースする時期と方法について詳しく説明します。
この明確さが欠けている理由の 1 つは、CancellationTokenSource
クラスにファイナライザーがないことです。これは、ガベージ コレクター (GC) が自動的にそれを解放できないことを意味します。したがって、トークン ソースを明示的に解放するのは開発者の責任になります。
それにもかかわらず、MSDN で提供されている例ではリリースについてほとんど言及されていません。では、推奨されるアプローチは何でしょうか?
リリース戦略
タスクの完了を待機する場合は 'using' ステートメントを使用します: 並列タスクの完了を待機している場合は、コードを 'using' ステートメントでラップできます。これにより、タスクの完了後にトークン ソースが自動的に解放されます:
<code class="language-C#"> using (CancellationTokenSource tokenSource = new CancellationTokenSource()) { Task.Run(() => { }, tokenSource.Token); }</code>
ContinueWith と手動リリースを使用します: あるいは、タスクに ContinueWith イベント ハンドラーを登録し、ハンドラー内のトークン ソースを手動で解放することもできます:
<code class="language-C#"> Task.Run(async () => { try { // 任务代码 } finally { tokenSource.Dispose(); } }, tokenSource.Token);</code>
キャンセル可能な PLINQ クエリ: 同期的に返されないキャンセル可能な PLINQ クエリの場合、すべての操作を CancellationTokenSource
イベント ハンドラーで実行することをお勧めします。 Dispose
再利用性と複数の使用: インスタンスは再利用できません。これらは、キャンセル操作ごとに作成および解放される必要があります。 CancellationTokenSource
直接解放する: 「using」ステートメントまたは ContinueWith イベント ハンドラーを使用できない場合は、目的を達成した後でトークン ソースを直接解放できます:
<code class="language-C#"> CancellationTokenSource tokenSource = new CancellationTokenSource(); Task.Run(() => { }, tokenSource.Token); // ... tokenSource.Dispose();</code>
概要
インスタンスを解放することは、メモリ リークを防止し、適切なリソース管理を確保するために重要です。推奨されるリリース戦略に従うことで、開発者はコード内でキャンセル操作を効率的に処理できます。 CancellationTokenSource
以上がCancelTokenSource をいつ、どのように破棄すればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。