2009-01-09 10 views
12

Angenommen, ich zwei Threads wie folgt beginnen:Wie werden Threads in .NET mit der Eigenschaft Name aufgelistet?

// Start first thread 
Thread loaderThread1 = new Thread(loader.Load); 
loaderThread1.Name = "Rope"; 
loaderThread1.Start(); 

// Start second thread 
Thread loaderThread2 = new Thread(loader.Load); 
loaderThread2.Name = "String"; 
loaderThread2.Start(); 

Gibt es eine Möglichkeit, die Fäden, indem sie ihre Eigenschaft Name aufzählen kann?

Ich möchte überprüft werden, ob ein Thread mit einem bestimmten Namen noch läuft.

Jeder von mir erstellte Thread arbeitet mit einer benannten Menge von Daten, der Name des Datensatzes wird als Name für den Thread verwendet, der mit den Daten arbeitet. Bevor ich einen Worker-Thread starte, möchte ich sehen, ob bereits ein früherer Thread für den gleichen Datensatz bereits läuft.

Die Gewinde, die ich bei der Verwendung von System.Diagnostics.GetCurrentProcess().Threads bekomme, sind vom Typ ProcessThread, nicht Thread!

+0

Nur eine kleine Anmerkung zu den Antworten unten hinzuzufügen, es in manchen Situationen sinnvoll sein kann Verwenden Sie WeakReference, um Speicherlecks zu verhindern. Threads können mit mehr Daten verbunden sein als die meisten realisieren, da Bibliotheken Dinge wie TLS/CallContext verwenden können. Wenn Sie nicht beabsichtigen, Ihre Threads nach dem Ende der WeakReference explizit aus der Sammlung zu entfernen, wird weiterhin die Garbage Collection zugelassen. – TheXenocide

Antwort

4

Ich vermute, Sie müssen möglicherweise die Threads in eine Dictionary<string,Thread> dafür zu arbeiten - aber warum wollen Sie es trotzdem? Es gibt normalerweise andere Arten der Kommunikation zwischen Threads (jedes der lock/wait-Objekte).

Um auf Prozessebene zu arbeiten (d. H. Nicht an das Objekt Thread zu denken), siehe - Sie könnten es auf den aktuellen Prozess beschränken, aber Sie können nicht mit dem Thread interagieren.

+0

Das ist genau was ich jetzt mache und es funktioniert gut. Ich hatte gehofft, dass es einen besseren (?) Weg geben würde! – Petteri

+0

Ich weiß nicht, warum es nützlich sein sollte, ein Wörterbuch zu haben, wenn er nur Enumeration wünscht, aber das ist nicht der Punkt ;-). Es ist nützlich, einen Überblick über die Vorgänge zu erhalten, um die Skalierung der App zu überwachen. Nicht für die Kommunikation zwischen Threads. –

0

Beachten Sie außerdem, dass Thread-Namen nicht eindeutig sein müssen. Scheint, als wäre die Verwendung der Thread-ID eine bessere Option ...

+0

ManagedThreadId wäre noch besser ... –

-1

Also, nach meinem Fehler mit den Prozess-Threads, hier ein Weg, wie Sie Ihre Threads halten. Nichts Spektakuläres, aber ich finde Coding-Beispiele sind jederzeit sehr praktisch.

List<Thread> threads = new List<Thread>(); 

for (int i = 0; i < 10; i++) 
{ 

    Thread t = new Thread(delegate() 
     { 
     do 
     { 
      Thread.Sleep(50); 
     } while (true); 
     }); 

    t.IsBackground = true; 
    t.Name = i.ToString(); 
    t.Start(); 
    threads.Add(t); 
} 

foreach (Thread t in threads) 
{ 
    Console.WriteLine(t.Name); 
} 
+0

Wenn ich Ihren Code richtig verstehe, speichert der Code jeden Thread in einer Liste, so wie Marc Gravell vorgeschlagen. Ich speichere die Threads in einem Dictionary . – Petteri

+0

Ja, wenn es einen Vorteil hat, dass Sie ein Wörterbuch verwenden, verwenden Sie es. Aber für meine Democode war eine Liste korrekt. –

-2

Ich denke, Sie folgende

System.Diagnostics.Process.GetCurrentProcess wollen(). Themen

+0

Kombiniert mit einer Art von Suche (foreach, LINQ-Anweisungen?) Auf die resultierende Sammlung, um den Thread mit dem gewünschten Namen zu erhalten. Beachten Sie, dass Thread-Namen nicht eindeutig sein müssen, wie andere Antworten erwähnt haben. – peSHIr

+0

Sorry, aber habe den gleichen Fehler gemacht, dass die Sammlung nicht Threads sondern ProcessThreads zurückgibt, also nicht die, die er in seinem Code startet. –

Verwandte Themen