2009-01-09 12 views
12

Załóżmy zacznę dwa wątki tak:Jak wyliczyć wątki w .NET za pomocą właściwości Nazwa?

// 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(); 

Czy jest jakiś sposób mogę wyliczyć wątki za pomocą ich własności na imię?

Chcę być w ukryciu, aby sprawdzić, czy wątek o określonej nazwie nadal działa.

Każdy wątek, który utworzę działa z nazwanym zbiorem danych, nazwa zestawu danych jest używana jako nazwa wątku pracującego z danymi. Przed uruchomieniem wątku roboczego chcę sprawdzić, czy poprzedni wątek dla tego samego zestawu danych już działa.

Gwinty, które otrzymuję podczas korzystania z System.Diagnostics.GetCurrentProcess().Threads, są typu ProcessThread, a nie Thread!

+0

Wystarczy dodać małą notatkę do poniższych odpowiedzi, może być mądry w niektórych sytuacjach użyj WeakReference, aby zapobiec wyciekom pamięci. Wątki mogą mieć więcej powiązanych z nimi danych, niż większość z nich wie, ponieważ biblioteki mogą używać takich rzeczy jak TLS/CallContext. Jeśli nie zamierzasz jawnie usuwać wątków z kolekcji po jej zakończeniu, WeakReference nadal będzie zezwalać na odśmiecanie. – TheXenocide

Odpowiedz

4

Podejrzewam, że może trzeba włożyć wątki do Dictionary<string,Thread>, aby to działało - ale dlaczego i tak chcesz? Zwykle istnieją inne sposoby komunikowania się między wątkami (dowolnym z obiektów blokujących/oczekujących).

Aby pracować na poziomie procesu (tzn. Nie myśl o obiekcie Thread), zobacz here - możesz ograniczyć go do bieżącego procesu, ale nie będziesz w stanie wchodzić w interakcje z wątkiem.

+0

To jest dokładnie to, co teraz robię i działa dobrze. Miałem nadzieję, że będzie lepszy (?) Sposób robienia tego! – Petteri

+0

Nie wiem, dlaczego warto mieć słownik, jeśli chce on tylko wyliczenia, ale nie o to chodzi ;-). Przydaje się przegląd tego, co się dzieje, aby monitorować skalowanie gry. Nie do komunikacji między wątkami. –

0

Należy również pamiętać, że nazwy nici nie muszą być unikatowe. Wygląda na to, że używanie identyfikatora wątku może być lepszym rozwiązaniem ...

+0

ManagedThreadId byłby jeszcze lepszy ... –

-1

Po tym, jak popełniłem błąd w wątkach procesowych, oto sposób na trzymanie wątków. Nic spektakularnego, ale myślę, że przykłady kodowania są bardzo przydatne w każdej chwili.

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

Jeśli dobrze zrozumiem twój kod, kod będzie przechowywać każdy wątek na liście, podobnie jak sugerował Marc Gravell. Przechowuję wątki w słowniku . – Petteri

+0

Tak, jeśli ma jakąkolwiek zaletę, że używasz słownika, użyj go. Ale dla mojej demokracji lista była poprawna. –

-2

myślę chcesz następujący

System.Diagnostics.Process.GetCurrentProcess(). Nici

+0

W połączeniu z pewnym rodzajem wyszukiwania (foreach, instrukcje LINQ?) W wynikowej kolekcji, aby uzyskać wątek o nazwie, którą chcesz. Pamiętaj, że nazwy nici nie muszą być unikatowe, o czym wspomniały inne odpowiedzi. – peSHIr

+0

Przepraszam, ale zrobił ten sam błąd, że kolekcja nie zwraca Nic, ale ProcessThreads, więc nie te, on zaczyna w swoim kodzie. –

Powiązane problemy