10

ThreadStatic 属性は、静的変数をスレッドごとに一意として宣言します。そのような変数を正しく処分する簡単なパターンを知っていますか?

ThreadStatic の前に使用したのは ThreadContextManager です。すべてのスレッドには、すべてのスレッド固有の情報を保持する ThreadContext が割り当てられました。いくつかのスレッドを生成し、それらを機能させました。次に、それらがすべて終了したら、ThreadContentManager を破棄しました。これにより、IDisposable の場合はすべてのコンテキストが破棄されました。

このパターンを ThreadStatic オブジェクトにすぐに変換する方法がわかりません。スレッドが死ぬため、オブジェクトは最終的に破棄され、スレッドを参照するものは何もありません。ただし、可能な限り決定論的な破棄を優先します。

アップデート

私は実際にスレッドを直接制御するわけではありません。タスクを実行する ThreadPool を持つ Microsoft CCR を使用しています。すべてのタスクが完了したら、Dispatcher (スレッドプールを保持する) を破棄します。問題は、「スレッドのメイン関数の最後に」何もする機会がないため、スレッドの実行の最後に手動で処理を行うことができないということです。どうにかして、スレッドの外部からスレッドの静的オブジェクトにアクセスできますか?

4

1 に答える 1

1

ThreadContextManagerクラスと同等のものを引き続き使用して、破棄を処理できます。生成されたスレッドは、この「マネージャー」オブジェクトを破棄します。このオブジェクトは、認識している他のすべてのスレッド静的オブジェクトを取り出します。

私は比較的少数のスレッド静的オブジェクトを持ち、代わりにコンテキストオブジェクトを使用することを好みます。これにより、スレッド固有の状態がほんの数か所に保持され、このようなパターンが簡単になります。

更新:スレッドプールのケースを処理するために、スレッドプールに渡すものであるベースの「タスク」オブジェクトを作成できます。コードに必要な一般的な初期化を実行し、「実際の」タスクを呼び出してから、必要なクリーンアップを実行できます。

于 2008-09-25T12:02:55.940 に答える