0

管理対象スレッドの終了をフックする方法はありますか(つまり、スレッドが終了する直前に、スレッドでコードを実行しますか?)

一部のスレッドで機能するスレッド出口をフックするメカニズムを開発しました。ステップ1:コールバック関数を受け取り、それをデストラクタで呼び出す「フック」STACOMクラスを開発します。手順2:フックするスレッドにこのオブジェクトのThreadStaticインスタンスを作成し、管理対象のデリゲートが管理対象外の関数ポインターに変換されたオブジェクトを渡します。次に、デリゲートはスレッド出口で呼び出されます(CLRがスレッド出口の一部としてすべてのSTACOMRCWでIUnknown::Releaseを呼び出すため)。

このメカニズムは、たとえば、Threadクラスを使用してコードで作成したワーカースレッドで機能します。

ただし、アプリケーションのメインスレッド(コンソールまたはWindowsアプリ)では機能しないようです。「フック」COMオブジェクトは、シャットダウンプロセスの後半で削除されたようで、デリゲートを呼び出そうとして失敗します。

(この機能を実装する理由は、スレッド上で作成されたSTA COMオブジェクトを処理する既存のスレッドで、「遅すぎる」前(つまり、スレッドが終了する前、およびスレッドが終了する前)にネイティブCOMコードを実行できるようにするためです。そのスレッドでSTACOMオブジェクトを操作することはできなくなりました。))

4

1 に答える 1

0

スレッドの作成を制御しますか? スレッドのコードを try...finally 句でラップし、コードを finally に入れるのがおそらく最も簡単です。

AppDomain がシャットダウンすると、シャットダウンが正常に行われない可能性があるため、コードが呼び出されることを確認できないことに注意してください。

「デストラクタ」と言うとき、C++/CLI デストラクタ、つまり .Dispose() メソッドを意味していると思いますか?

プロセスが終了する前にフックをサポートする必要がある場合はAppDomain.CurrentDomain.ProcessExit、未処理の例外で発生しないように見えるイベント、または未処理の例外でAppDomain.CurrentDomain.UnhandledExceptionのみ発生するように見えるイベントを試すことができます。

これはどれも特に堅牢に見えませんが、気をつけてください...

于 2009-07-26T14:09:15.287 に答える