TPL タスクを破棄しない: 結果と代替解決策
完了を待たずにバックグラウンドで実行するタスクをトリガーする場合、共通のTask.Factory.StartNew() を使用すると、返された Task オブジェクトに対して Dispose() を呼び出す必要性について疑問が生じます。 MSDN はすべてのタスクを破棄することを推奨していますが、この特定のシナリオにおけるタスクの破棄の問題は見落とされがちです。
破棄しない場合の結果について、 Microsoft PFX チーム メンバーの Stephen Toub 氏は次のように説明しています。 Task.Dispose() は、特定の待機シナリオで使用されるイベント ハンドルを処理するために存在します。ただし、継続がタスクにアクセスする主な手段である場合、このイベント ハンドルは決して割り当てられません。 Stephen Toub は、これらのタスクを管理するためにファイナライズに依存することを提案しています。このトピックに関する
公式ドキュメントは限られています。ただし、Stephen Toub のブログ投稿「タスクを破棄する必要がありますか?」では、この問題を詳しく説明し、.Net 4.5 で導入された改善点を強調しています。
一般に、破棄する必要はありません。 破棄する理由には、管理されていないリソースを速やかに解放することや、ファイナライザーのコストを回避することが含まれます。ただし、通常、次の考慮事項は Task オブジェクトには適用されません。
TPL を使用したファイア アンド フォーゲット タスクの代替メソッド:
タスク オブジェクトの破棄が依然として懸念される場合は、別のアプローチがあります。
以上がFire-and-Forget TPL タスクを破棄する必要がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。