タスク並列ライブラリ (TPL) を使用して、完了を待たずにバックグラウンド タスクを開始する場合、次のような疑問が生じます。返された Task オブジェクトを破棄することが重要です。この記事は、この懸念に対処し、Dispose() メソッドを呼び出さない場合の影響を探ることを目的としています。
TPL では、StartNew() メソッドは Task オブジェクトを返します。これは IDisposable インターフェイスを実装します。 Task.Dispose() の MSDN ドキュメントには、Task への最後の参照を解放する前に Dispose を呼び出すことの重要性が記載されています。
1 つの懸念は、Task オブジェクトが割り当てを行う可能性があることです。待機ハンドルなどのアンマネージ リソース。メモリ リークを避けるために、Dispose() を通じて明示的に解放する必要があります。しかし、Microsoft pfx チームのメンバーである Stephen Toub 氏は、このシナリオの可能性は低いと明言しています。
Toub 氏によると、タスク オブジェクトは、(タスクのスピンや実行ではなく) 待機中にブロックが必要な場合にのみイベント ハンドルを割り当てます。待機中のタスク)。継続を使用する場合、このイベント ハンドルは決して割り当てられません。
明示的に呼び出されない場合、ファイナライザーは最終的に Task オブジェクトに関連付けられたアンマネージ リソースを再利用します。ただし、ファイナライゼーションに依存することは、ファイナライザ スレッドを圧倒する可能性があるため、特に大量のファイア アンド フォーゲット タスクを処理する場合には理想的ではない可能性があります。
要約すると、一般的な通常、ほとんどのシナリオでは Task オブジェクトを破棄する必要はないというのがコンセンサスです。次の推奨事項はガイダンスを提供します。
以上がTPL 内のタスク オブジェクトを破棄する必要がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。