Ich habe einen verwalteten Thread, der auf einen nicht verwalteten Code wartet (blockiert), (insbesondere bei einem Aufruf von NamedPipeServerStream.WaitForConnection (), der ultimativ in nicht verwalteten Code aufruft, und nicht a anbietet Timeout).
Ich möchte den Thread sauber schließen.
Thread.Abort () hat keine Auswirkungen, bis der Code in den verwalteten Bereich zurückkehrt, was nicht möglich ist, bis ein Client eine Verbindung herstellt, auf die wir nicht warten können.
Ich brauche einen Weg, um ihn aus dem nicht verwalteten Code herauszuschrecken; oder eine Möglichkeit, den Faden zu töten, selbst wenn er sich in unkontrolliertem Land befindet.
Haben Sie versucht, das nicht blockierende NamedPipeServerStream.BeginWaitForConnection Methode?
%Vor%Sie müssen nicht unbedingt ein festes Timeout verwenden. Sie können ein ManualResetEvent verwenden, um zu signalisieren, wenn der Thread nicht mehr auf die Verbindung warten soll :
%Vor%Es gibt keine Möglichkeit, einen Thread "sauber" von außen herunterzufahren, wenn dieser Thread nicht verwalteten Code ausführt. Es gibt einige Möglichkeiten, den Thread abrupt zu beenden, aber das ist wahrscheinlich nicht das, was du willst.
Sie sollten stattdessen BeginWaitForConnection
verwenden.
Tatsächlich war die Lösung, die ich verwendete (was mir beim Schreiben der Frage aufgefallen war), nach dem Abbrechen aller Threads, nur einen Client für jeden Thread zu erstellen (und sofort zu entsorgen).
%Vor%Mit der Verbindung kehrt es zum verwalteten Code zurück, und der Abort () tritt ein (der Thread fängt ThreadAbortException auf und bereinigt sich)
Dies funktioniert nicht für den allgemeinen Fall (d. h. die Frage im Titel), aber es funktioniert für mich ...
Tags und Links .net c# multithreading