2009-01-09 5 views
12

Supposons que je commence deux fils comme ceci:Comment énumérer des threads dans .NET en utilisant la propriété Name?

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

Est-il possible que je peux énumérer les fils en utilisant leur propriété Name?

Je veux être capable de vérifier si un thread avec un nom spécifique est toujours en cours d'exécution.

Chaque thread que je crée fonctionne avec un ensemble de données nommé, le nom de l'ensemble de données est utilisé comme nom pour le thread travaillant avec les données. Avant de démarrer un thread de travail, je veux voir si un thread précédent pour le même jeu de données est déjà en cours d'exécution.

Les fils que j'obtiens en utilisant System.Diagnostics.GetCurrentProcess().Threads sont de type ProcessThread, pas Thread!

+0

Juste pour ajouter une petite note aux réponses ci-dessous, il peut être sage dans certaines situations utilisez WeakReference pour éviter les fuites de mémoire. Les threads peuvent avoir plus de données associées que la plupart ne le pensent car les bibliothèques peuvent choisir d'utiliser des choses comme TLS/CallContext. Si vous ne prévoyez pas de supprimer explicitement vos threads de la collection lorsqu'ils se terminent, WeakReference autorise toujours la récupération de place. – TheXenocide

Répondre

4

Je suppose que vous pourriez avoir à mettre les threads dans un Dictionary<string,Thread> pour que cela fonctionne - mais pourquoi voulez-vous quand même? Il existe généralement d'autres moyens de communiquer entre les threads (l'un des objets lock/wait). Pour travailler au niveau du processus (c'est-à-dire sans tenir compte de l'objet Thread), voir here - vous pouvez le limiter au processus en cours, mais vous ne pourrez pas interagir avec le thread.

+0

C'est exactement ce que je fais maintenant et ça marche bien. J'espérais qu'il y aurait une meilleure (?) Façon de le faire! – Petteri

+0

Je ne sais pas pourquoi il devrait être utile d'avoir un dictionnaire, s'il veut simplement Enumeration, mais ce n'est pas le point ;-). Il est utile d'avoir une vue d'ensemble de ce qui se passe, pour surveiller la mise à l'échelle de l'application. Pas pour communiquer entre les threads. –

0

Notez également que les noms de thread ne doivent pas nécessairement être uniques. On dirait que l'utilisation de l'ID de thread peut être une meilleure option ...

+0

ManagedThreadId serait encore mieux ... –

-1

Donc, après mon erreur avec les threads de processus, voici comment conserver vos Threads. Rien de spectaculaire, mais je pense que les exemples de codage sont très utiles à tout moment.

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

Si je comprends bien votre code, le code stockera chaque thread dans une liste, à peu près comme suggéré par Marc Gravell. Je stocke les discussions dans un Dictionary . – Petteri

+0

Oui, si vous utilisez un dictionnaire, utilisez-le. Mais pour mon democode une liste était correcte. –

-2

Je pense que vous voulez que le suivant

System.Diagnostics.Process.GetCurrentProcess(). Threads

+0

Combiné avec une sorte de recherche (foreach, instructions LINQ?) Sur la collection résultante pour obtenir le fil avec le nom que vous voulez. Attention, les noms de Thread ne doivent pas être uniques, comme d'autres réponses l'ont mentionné. – peSHIr

+0

Désolé, mais fait la même erreur, cette collection ne renvoie pas Threads mais ProcessThreads, donc pas ceux, il commence dans son code. –

Questions connexes