2009-07-26 6 views
0

Gibt es eine Möglichkeit für mich, die Ausfahrt von verwalteten Threads Haken (dh einen Code auf einem Thread ausgeführt, kurz bevor es beendet?)Anspannen Fadenausgang

ich einen Mechanismus zum Einhaken Fadenausgang entwickelt haben, die funktioniert für einige Threads. Schritt 1: Entwickeln Sie eine STA COM-Klasse "hook", die eine Rückruffunktion übernimmt und sie in ihrem Destruktor aufruft. Schritt 2: Erstellen Sie eine ThreadStatic-Instanz dieses Objekts im Thread, den ich haken möchte, und übergeben Sie dem Objekt einen verwalteten Delegaten, der in einen nicht verwalteten Funktionszeiger konvertiert wurde. Der Delegat wird dann beim Thread-Exit aufgerufen (da die CLR IUnknown :: Release für alle STA COM RCWs als Teil des Thread-Exits aufruft).

Dieser Mechanismus funktioniert z. B. bei Worker-Threads, die ich im Code mithilfe der Thread-Klasse erstelle.

Es scheint jedoch nicht für den Hauptthread der Anwendung zu funktionieren (sei es eine Konsole oder Windows-App). Das COM-Objekt "Hook" scheint beim Herunterfahren zu spät gelöscht zu werden, und der Versuch, den Delegaten aufzurufen, schlägt fehl.

(Der Grund, warum ich diese Einrichtung implementieren möchte, ist, damit ich nativen COM-Code für den auslaufenden Thread ausführen kann, der mit STA COM-Objekten arbeitet, die im Thread erstellt wurden, bevor 'zu spät' (dh vor dem Thread) wurde beendet, und es ist nicht mehr möglich, mit STA COM-Objekten in diesem Thread zu arbeiten.))

Antwort

0

Steuern Sie die Thread-Erstellung? Es ist wahrscheinlich am einfachsten, den Code des Threads einfach in eine try ... finally-Klausel zu packen und den Code in den finally-Code einzufügen.

Beachten Sie, dass Sie beim Herunterfahren der AppDomain nie sicher sein können, dass Ihr Code aufgerufen wird, da das Herunterfahren möglicherweise nicht so gut ist.

Wenn Sie "Destruktor" sagen, nehme ich an, dass Sie einen C++/CLI-Destruktor meinen - also die .Dispose() -Methode?

Wenn Sie das Hooking vor dem Beenden des Prozesses unterstützen müssen, können Sie das Ereignis AppDomain.CurrentDomain.ProcessExit versuchen, das scheinbar nicht ausgelöst wird, oder AppDomain.CurrentDomain.UnhandledException, das nur bei einer unbehandelten Ausnahme ausgelöst wird.

Nichts davon sieht besonders robust aus, wohlgemerkt ...

+0

Absatz 1: nein. Absatz 2: Ja, aber kein Problem. Absatz 3: Nein, der Destruktor der nativen C++ - Implementierung der Co-Klasse. Absatz 4: hmmm, ich werde das überprüfen. Absatz 5: Notwendig dennoch. – mackenir

+0

Leider wird AppDomain ProcessExit für einen anderen Thread als den Hauptthread aufgerufen. – mackenir