2014-06-06 10 views
7

Nach der Suche auf Stack Overflow Fragen und etwas googeln, bekomme ich es immer noch nicht.Nennen Sie Thread nach Name von ProcessThreadCollection

Ich bin mir bewusst, dass Sie überprüfen können, ob ein einzelner Thread mit "Thread.isAlive()" -Methode ausgeführt wird, aber ich möchte überprüfen, ob ein bestimmter "FooThread" noch zwischen allen laufenden Threads des aktuellen Prozesses läuft, und falls nicht, rufen Sie die Methode auf, die es startet.

//somewhere in the code, on another Project/DLL inside solution 
private void FooThreadCaller() 
{ 
    Action act =() => fooFunction(); 
    Thread t = new Thread(new ThreadStart(act)); 
    t.Name = "FooThread"; 
    t.Start(); 
} 
//... 
Process proc = System.Diagnostics.Process.GetCurrentProcess(); 
ProcessThreadCollection threads = proc.Threads; 
bool ThreadExists = false 
foreach (ProcessThread item in threads) 
{ 
    // if item.Name == "FooThread", then ThreadExists = true... 
    // so, if !ThreadExists then call FooThreadCaller() and so on. 
} 
//... 

Da die Process Klasse nicht über eine Eigenschaft "Name" (wie System.Threading.Thread tut), sondern nur ID, und ich kenne nur den Thread-Namen ("FooThread ") nicht die ID, wie kann ich prüfen ob" FooThread "läuft/lebt?

Vielen Dank im Voraus

+1

Selbst wenn das möglich wäre, wäre das keine gute Idee. Wenn der Thread gerade dabei wäre, auszusteigen, würdest du ihn als noch laufend wahrnehmen. Dies ist von Natur aus rassig. Verfolgen Sie diese Informationen selbst. Wenn FooThread herunterfährt, mach es nicht. Wenn es beginnt, notieren Sie sich. – usr

+2

Sie tun etwas sehr, sehr falsch. Jeder Test "ist ein Thread, der noch läuft" ist nutzlos, er läuft möglicherweise eine Nanosekunde später nicht. Gut, dass es nicht funktioniert. –

+2

Das sind großartige Kommentare, aber es lohnt sich auch darauf hinzuweisen, dass das OP tatsächlich überprüft, ob der Thread * nicht * läuft. – Slider345

Antwort

5

Wie in den anderen Antworten erwähnt, unterscheiden sich die ProcessThread und die Thread-Objekte. Ihre DLL erstellt ein eigenes Thread-Objekt, aber dann wird der Verweis auf dieses Objekt verworfen. Dann fragen Sie später das Betriebssystem (über System.Diagnostics) nach diesem Thread ab und erwarten dasselbe Level an Zugriff, das Sie zuvor als Ersteller des Threads hatten.

Stattdessen sollten Sie die Verweise auf Ihre Thread-Objekte speichern, während Sie sie erstellen. Vielleicht könnte Ihre DLL ein öffentliches statisches Sammlungsobjekt implementieren, dem Sie dann Ihre Thread-Objekte hinzufügen würden, wenn Sie sie erstellen.

Dann außerhalb Ihrer DLL können Sie die Sammlung durchlaufen und überprüfen Sie die Namen und den Status der einzelnen Thread.

+1

Vielen Dank @ Slider345. Ich werde das überprüfen. –

2

Ich glaube nicht, dass es eine Möglichkeit, das zu tun ist. A ProcessThread repräsentiert einen OS Thread. Ein Thread repräsentiert einen verwalteten Thread in Ihrer Anwendung. Es gibt nicht wirklich eine Beziehung zwischen den beiden. Weiterhin ist das Mapping von Thread und ProcessThread NICHT 1: 1, wie in ProcessThread kann mehrere Thread s darstellen.

3

ProcessThread steht für einen Betriebssystem-Level-Thread, während Thread für einen .Net verwalteten Thread steht. Ein Thread auf Betriebssystemebene hat keinen Namen, sondern eine eindeutige ID (genau wie ein Prozess).

Anstatt die Liste des aktuellen Threads einzuchecken, wenn Ihr Thread noch läuft, sollten Sie wahrscheinlich die Logik Ihres Codes ändern. Beispielsweise könnten Sie einen Booleschen Wert beibehalten, der den Status Ihres Threads enthält, und ihn beim Starten/Beenden aktualisieren.

Verwandte Themen