当社の製品(24時間365日稼働できるWindowsサービス)に第三者コンポーネントを追加する必要があります。
3PCは、画像を操作するためのいくつかのハードコアC++の美しさに乗っている.netライブラリです。
3PCが必要です初期化およびTeardownルーチンは、それが実行されるスレッドごとに呼び出されます。
これは古いソフトウェアで使用する場合は問題ありませんが、この製品は.Netスレッドプールで作成され、プールされた作業者は3PCを実行します。 初期化とTeardownルーティンを安全に呼び出す方法がわかりません。 3PC Initialize
メソッドを呼び出すために、ThreadStaticメンバーを初期化するとき プールされたスレッド(またはThreadStaticメンバ)がいつ破壊されるかを知りたいですか?
私が得た最も近い
は、しかし、私はInitialize
がコールされたのと同じスレッド上で
Teardown
を呼び出すために管理することはできませんでした。
私がオブジェクトで呼び出さTeardown
メソッドをファイナライズし、その後、Teardown
がオブジェクトが静的にありませんスレッド、GC自身のファイナライズスレッドによって呼び出されます、オブジェクト内のInitialize
とTeardown
をラップする場合(ファイナライザが実行する保証がないという事実はもちろんですが)。
はもちろん、私ははカバーの下スレッド、スレッドが破壊されたり作成される場合、またはとき私は見当がつかないを管理し、スレッドプールなど漏れた資源心配ので、私はどのくらいさっぱりだがサービスは一定期間にわたって漏洩する可能性があります。
誰でもいいですね。私が逃したものは何ですか?他に何か試してみませんか?
おかげ
更新
Q:ティアダウンは何をしますか?
私は「メモリを解放します」と思っていますが、私は正直言って考えていません。 Reflectorでアセンブリを分割しようとしましたが、すぐにILからネイティブのマシンコードに落ちます。私はこれをやらなければならない(第3)党線に行くつもりです。
これは間違いなくサブシステムの破損物です。
また、数年前、私たちは別の製品でこのコンポーネントの周辺にバグを発見しました。初期化子は非常にまれにしか見られないいくつかのスレッドで呼び出されていない未定義の動作。
Initialize and Teardownの機能は何ですか?スレッドにとらわれない方法で安全に機能するように3PCライブラリを説得するのが最適でしょう。特に、「ティアダウン」は何をしていますか?それは、イメージ上のある/すべての操作の後に常に呼び出さなければならないのですか、それともサブシステムのシャットダウン/終了の問題でしょうか? –
@Martin:質問に詳細を追加しました。 –
スレッドプールで実行する作業単位の前後に 'Initialize'と' Teardown'を呼び出すことができますか? –