サードパーティのコンポーネントを製品の1つに追加する必要があります(これは24時間年中無休で実行できるWindowsサービスです)。
3PCは、画像を操作するためのハードコアC++の可愛らしさの上にある.netライブラリです。
3PCでは、実行するスレッドごとにInitializeルーチンとTeardownルーチンを呼び出す必要があります。
これは、古いソフトウェアで使用する場合は問題ありませんが、この製品は.Netスレッドプールを使用して作成されており、プールされたワーカーは3PCを実行します。InitializeルーチンとTeardownルーチンを安全に呼び出す方法がわかりません。
私が得た最も近いのは、ThreadStaticメンバーを初期化して、3PCメソッドを呼び出すときでしたが、呼び出されたのと同じスレッドでInitialize
を呼び出すことができません。Teardown
Initialize
Initialize
とTeardown
をオブジェクトでラップTeardown
し、オブジェクトのFinalizeメソッドで呼び出されると、オブジェクトが静的なスレッドTeardown
ではなく、GC自体のFinalizeスレッドによって呼び出されます(ファイナライザーの保証がないことは言うまでもありません)。実行されます)。
明らかに、スレッドプールが内部でスレッドを管理しているため、リソースのリークが心配です。スレッドが破棄または作成されるかどうか、いつ作成されるかわからないため、サービスが一定期間にどれだけリークする可能性があるかわかりません。 。
誰かアイデアはありますか?私が見逃したものはありますか?他に試すことはありますか?
ありがとう
アップデート
Q:ティアダウンは何をしますか?
「記憶を解放する」と思いますが、正直わかりません。Reflectorを使用してアセンブリをスプランキングしようとしましたが、ILからネイティブマシンコードにすぐにドロップします。私はこれが行われなければならないという(サードパーティの)パーティラインに行きます。
それは間違いなくサブシステムの分解です。
また、数年前、別の製品でこのコンポーネントに関するバグを発見しました。イニシャライザーがすべてのスレッドに対して呼び出されていなかったため、非常にまれにしか見られない未定義動作が発生しました。