Comment voulez-vous obtenir la liste des threads en cours d'exécution en C#?
Je créer des dynamiques de threads en C# et j'ai besoin d'obtenir le statut de ces threads en cours d'exécution.
List<string>[] list;
list = dbConnect.Select();
for (int i = 0; i < list[0].Count; i++)
{
Thread th = new Thread(() =>{
sendMessage(list[0]['1']);
//calling callback function
});
th.Name = "SID"+i;
th.Start();
}
for (int i = 0; i < list[0].Count; i++)
{
//here how can i get list of running thread here.
}
Comment pouvez-vous obtenir la liste des threads en cours d'exécution?
- Vous avez besoin de la liste de threads que vous avez créé ou tous les threads?
Vous devez vous connecter pour publier un commentaire.
Créer un
List<Thread>
et stocker chaque nouveau fil, pour la première boucle.Toutefois, si vous n'avez pas besoin
i
vous pouvez faire la deuxième boucle unforeach
au lieu d'unfor
Comme une note de côté, si votre
sendMessage
fonction ne prend pas beaucoup de temps à s'exécuter, vous devriez somthing poids plus léger alors un Fil, utiliser un ThreadPool.QueueUserWorkItem ou si elle est à votre disposition, un TâcheThread
n'ont pas deDoStuff
méthode (mais je suppose qu'il pourrait être mis en œuvre avec une méthode d'extension)Start
,Interrupt
,Join
, etc.Sur Les Threads
Je voudrais éviter de créer explicitement des threads sur votre propre.
Il est beaucoup plus préférable d'utiliser le
pool de threads.QueueUserWorkItem
ou si vous ne pouvez utiliser .Net 4.0, vous obtenez beaucoup plus puissant Task parallel library qui vous permet également d'utiliser un pool de threads les threads dans un moyen beaucoup plus puissant (Tâche.Usine.StartNew
vaut le coup d'oeil)Que si nous choisissons d'aller sur l'approche de la création explicitement les threads?
Supposons que votre liste[0].Comte revient de 1000 points. Supposons également que vous effectuez cette opération sur un haut de gamme (au moment d'écrire ces lignes) 16core de la machine. L'effet immédiat est que nous avons 1000 threads concurrence pour ces ressources limitées (le 16 cœurs).
Le plus grand nombre de tâches et de plus chacun d'eux exécute, plus de temps sera consacré à la commutation de contexte. En outre, la création de threads est cher, cette surcharge de la création de chaque thread explicitement pourraient être évités si une approche de réutiliser des threads est utilisé.
Ainsi, alors que l'intention initiale de multithreading peut être à augmentation de vitesse, comme nous pouvons le voir, il peut tout à fait le en face de effet.
Comment pouvons-nous surmonter les 'plus'de thread?
C'est là que le
pool de threads
entre en jeu.Comment fonctionnent-elles:
Nous voyons donc qu'en utilisant un pool de threads nous sommes plus efficaces à la fois
pool de threads.GetMaxThreads
). La principale raison derrière ce choix de conception, bien sûr, est de sorte à ne pas trop saturer le nombre limité de cœurs avec trop de thread demandes de maintien de la commutation de contexte à des niveaux inférieurs.Trop de Théorie, nous allons mettre toute cette théorie à l'épreuve!
Droit, il est bon de savoir que tout ce en théorie, mais nous allons mettre en pratique et voir ce que
les chiffres nous montrent, avec un simplifiée brut version de l'application qui peut nous donner une indication grossière de la différence dans les ordres de grandeur. Nous allons faire une comparaison entre le nouveau Thread pool de threads et de la Task Parallel Library (TPL)
nouveau Thread
Résultat:
Pool de threads.EnqueueUserWorkItem
Résultat:
Task Parallel Library (TPL)
Résultat:
Ainsi, nous pouvons voir que:
Ci-dessus tombe bien en ligne pour ce que nous avions anticipé en théorie. De mémoire pour les nouveaux Fil ainsi que d'un ralentissement de la performance globale comparativement à ThreadPool. Pool de threads et de TPL ont des performances équivalentes avec TPL avoir un peu plus de mémoire qu'une pure pool de threads, mais c'est probablement le prix à payer compte tenu de la flexibilité des Tâches (tels que des frais d'annulation, en attendant l'achèvement de l'interrogation d'état de la tâche)
À ce point, nous avons montré que l'utilisation de pool de threads threads est l'option préférable en termes de rapidité et de mémoire.
Encore, nous n'avons pas répondu à votre question. Comment suivre l'état de threads en cours d'exécution.
Pour répondre à votre question
Donné les observations que nous avons recueillies, c'est comment je pourrais l'aborder:
Comme note finale, vous pouvez pas utiliser la variable i dans votre Fil.Départ, car il permettrait de créer une fermeture de plus d'un changement de variable qui serait effectivement partagée par tous les Threads. Pour contourner ce problème (en supposant que vous avez besoin pour accéder à i), il suffit de créer une copie de la variable et de transmettre la copie, ce serait faire une fermeture par thread, ce qui en ferait thread-safe.
Bonne chance!
Utilisation
Processus.Threads
:Remarque: tout fils possédé par le processus en cours s'affichera ici, y compris ceux qui ne sont pas explicitement créés par vous.
Si vous voulez seulement le fils que vous avez créé, eh bien, pourquoi ne pas simplement garder une trace d'eux quand vous le créer?
var threads
dans ce cas est un ProcessThreadCollection, purement contient des informations sur les fils, pas leThread
objets eux-mêmes.Cela vous donne une liste de tous les threads en cours d'exécution dans le processus actuel, mais méfiez-vous qu'il y a des threads autres que celles que vous avez commencé à vous-même.
Utilisation
Process.Threads
parcourir votre fils.