管理対象スレッドの終了をフックする方法はありますか(つまり、スレッドが終了する直前に、スレッドでコードを実行しますか?)
一部のスレッドで機能するスレッド出口をフックするメカニズムを開発しました。ステップ1:コールバック関数を受け取り、それをデストラクタで呼び出す「フック」STACOMクラスを開発します。手順2:フックするスレッドにこのオブジェクトのThreadStaticインスタンスを作成し、管理対象のデリゲートが管理対象外の関数ポインターに変換されたオブジェクトを渡します。次に、デリゲートはスレッド出口で呼び出されます(CLRがスレッド出口の一部としてすべてのSTACOMRCWでIUnknown::Releaseを呼び出すため)。
このメカニズムは、たとえば、Threadクラスを使用してコードで作成したワーカースレッドで機能します。
ただし、アプリケーションのメインスレッド(コンソールまたはWindowsアプリ)では機能しないようです。「フック」COMオブジェクトは、シャットダウンプロセスの後半で削除されたようで、デリゲートを呼び出そうとして失敗します。
(この機能を実装する理由は、スレッド上で作成されたSTA COMオブジェクトを処理する既存のスレッドで、「遅すぎる」前(つまり、スレッドが終了する前、およびスレッドが終了する前)にネイティブCOMコードを実行できるようにするためです。そのスレッドでSTACOMオブジェクトを操作することはできなくなりました。))