ホームページ > バックエンド開発 > C++ > Fire-and-Forget TPL タスクを破棄する必要がありますか?

Fire-and-Forget TPL タスクを破棄する必要がありますか?

Linda Hamilton
リリース: 2025-01-05 16:26:42
オリジナル
820 人が閲覧しました

Do I Need to Dispose of Fire-and-Forget TPL Tasks?

TPL タスクを破棄しない: 結果と代替解決策

完了を待たずにバックグラウンドで実行するタスクをトリガーする場合、共通のTask.Factory.StartNew() を使用すると、返された Task オブジェクトに対して Dispose() を呼び出す必要性について疑問が生じます。 MSDN はすべてのタスクを破棄することを推奨していますが、この特定のシナリオにおけるタスクの破棄の問題は見落とされがちです。

破棄しない場合の結果について、 Microsoft PFX チーム メンバーの Stephen Toub 氏は次のように説明しています。 Task.Dispose() は、特定の待機シナリオで使用されるイベント ハンドルを処理するために存在します。ただし、継続がタスクにアクセスする主な手段である場合、このイベント ハンドルは決して割り当てられません。 Stephen Toub は、これらのタスクを管理するためにファイナライズに依存することを提案しています。このトピックに関する

公式ドキュメントは限られています。ただし、Stephen Toub のブログ投稿「タスクを破棄する必要がありますか?」では、この問題を詳しく説明し、.Net 4.5 で導入された改善点を強調しています。

一般に、破棄する必要はありません。 破棄する理由には、管理されていないリソースを速やかに解放することや、ファイナライザーのコストを回避することが含まれます。ただし、通常、次の考慮事項は Task オブジェクトには適用されません。

  • .Net 4.5 以降では、内部待機ハンドルは、IAsyncResult.AsyncWaitHandle を明示的に使用する場合にのみ割り当てられます。
  • Task オブジェクト自体ファイナライザはありません。待機ハンドルはファイナライザーを備えたオブジェクトでラップされ、ハンドルが割り当てられた場合にのみ実行されます。

TPL を使用したファイア アンド フォーゲット タスクの代替メソッド:

タスク オブジェクトの破棄が依然として懸念される場合は、別のアプローチがあります。

  • .Net 3.5 以降の ThreadPool.QueueUserWorkItem() メソッド。
  • タスクを返さずに作成: Task.Run(() => DoSomething());.
  • タスクを使用する.ContinueWith メソッドを使用して、自動クリーンアップを実行する継続をアタッチします。

以上がFire-and-Forget TPL タスクを破棄する必要がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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