Comment faire pour compter le montant de threads simultanés .NET application?
Avoir lu En parallèle.ForEach garde de frai de nouveaux threads je suis toujours dans le doute de savoir si c'est une bonne méthode de comptage du nombre de connexions simultanées il threads?
Ce que je vois, c'est que la méthode de comptage du nombre de simultanément saisis mais pas terminé itérations (boucles) dans Parallel.ForEach
.
Est-il synonyme du nombre de threads simultanés de convoyage nombre correct d'exécuter simultanément des threads?
Je ne suis pas un spécialiste, mais je peux imaginer que:
- les threads peuvent être ré-utilisés, alors que son activité échangé quelque part pour continuer plus tard.
- théoriquement le fil engagé pour une boucle de l'activité est maintenue dans le pool de thread une fois la boucle terminée mais pas réutilisé pour un autre
- Ou quelles sont les possibilités de distorsion de la pureté de l'expérience (de threads de comptage)?
De toute façon, comment compter le montant de threads en cours d'exécution .NET de processus, de préférence en C#) code?
Mise à jour:
Donc, si pour suivre les Jeppe Stig Nielsen répondre et de l'utiliser pour compter
directThreadsCount = Process.GetCurrentProcess().Threads.Count;
puis la sortie est, à la fois dans la Version (threadsCount == 7) et de Débogage (threadsCount == 15) mode de fonctionnement est très similaire:
[Job 0 complete. 2 threads remaining but directThreadsCount == 7
[Job 1 complete. 1 threads remaining but directThreadsCount == 7
[Job 2 complete. 2 threads remaining but directThreadsCount == 7
[Job 4 complete. 2 threads remaining but directThreadsCount == 7
[Job 5 complete. 2 threads remaining but directThreadsCount == 7
[Job 3 complete. 2 threads remaining but directThreadsCount == 7
[Job 6 complete. 2 threads remaining but directThreadsCount == 7
[Job 9 complete. 2 threads remaining but directThreadsCount == 7
[Job 7 complete. 1 threads remaining but directThreadsCount == 7
[Job 8 complete. 0 threads remaining but directThreadsCount == 7
FINISHED
Qui est, le nombre de threads ne sont pas toujours en diminuant dire que la méthode citée ci-dessus est incorrect tout System.Diagnostics.ProcessThread
donne "Class name is not valid at this point"
Sont mes conclusions correct et pourquoi ne pas ?ProcessThread
être utilisés
Le code de l'application console C#:
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
namespace Edit4Posting
{
public class Node
{
public Node Previous { get; private set; }
public Node(Node previous)
{
Previous = previous;
}
}
public class Edit4Posting
{
public static void Main(string[] args)
{
int concurrentThreads = 0;
int directThreadsCount = 0;
int diagThreadCount = 0;
var jobs = Enumerable.Range(0, 10);
Parallel.ForEach(jobs, delegate(int jobNr)
{
int threadsRemaining = Interlocked.Increment(ref concurrentThreads);
int heavyness = jobNr % 9;
//Give the processor and the garbage collector something to do...
List<Node> nodes = new List<Node>();
Node current = null;
//for (int y = 0; y < 1024 * 1024 * heavyness; y++)
for (int y = 0; y < 1024 * 24 * heavyness; y++)
{
current = new Node(current);
nodes.Add(current);
}
//*******************************
//uncommenting next line gives: "Class name is not valid at this point"
//diagThreadCount=System.Diagnostics.ProcessThread
directThreadsCount = Process.GetCurrentProcess().Threads.Count;
//*******************************
threadsRemaining = Interlocked.Decrement(ref concurrentThreads);
Console.WriteLine(
"[Job {0} complete. {1} threads remaining but directThreadsCount == {2}",
jobNr, threadsRemaining, directThreadsCount);
});
Console.WriteLine("FINISHED");
Console.ReadLine();
}
}
}
OriginalL'auteur Fulproof | 2013-03-13
Vous devez vous connecter pour publier un commentaire.
Il existe différents types de threads, je pense. Le système d'exploitation de threads de l'application que vous êtes en cours d'exécution, peuvent être comptées avec:
Il semble compter
System.Diagnostics.ProcessThread
instances. Peut-être vous avez besoin de compter un autre type de fil, comme "les threads gérés", donc je ne suis pas sûr de ma réponse, est ce que vous cherchez.Thread
s etProcessThread
s pourraient être différents. Dans la pratique, ils sont presque toujours les mêmes.Un très simple application console qui écrit les biens ci-dessus, donne
4
, parfois3
. Je pense que c'était un one-thread de l'application. Lors de la même application de débogage (débogueur), le nombre est beaucoup plus élevé, comme12
ou13
. Dans une autre application, si je commence beaucoup de nouvelles discussions avec leSystem.Threading.Thread
classe, le comte deSystem.Diagnostics.ProcessThread
augmente d'environ le nombre correct. (Essayé sur Windows 7 64 bits.)OriginalL'auteur Jeppe Stig Nielsen
Pas - en dehors de quelques très cas particuliers (qui vous avez presque certainement n'avez pas besoin de vous soucier de threads ne sont pas utiliser reentrantly. Le fil sera réutilisé pour exécuter une autre itération (ou une autre tâche) après l'itération en cours est terminée, mais il ne sera pas demandé de faire quelque chose d'autre tout votre code est en cours d'exécution.
Si votre approche est raisonnable, dans le fond.
Vous pouvez regarder dans l'analyseur de performances, qui seront graphique pour vous. (Si le processus est sous votre contrôle, c'est plus simple pour démarrer le processus, mais de le faire attendre pour l'entrée, puis ouvrez l'analyseur de performances, ajouter un compteur de "Processus" options", sélectionnez "Thread Count" comme le compteur à ajouter, et de le restreindre à ce processus qui vous intéresse dans la liste déroulante. Cliquez sur OK, et puis faire de votre démarrage du processus de travail.)
EDIT: pour répondre À la mise à jour:
Non, tout ce que ça montre c'est que le nombre de threads en cours d'exécution de votre code diminue, mais les fils sont conservés. C'est tout à fait naturel pour un pool de threads.
Vous êtes tout simplement de l'utiliser de façon inappropriée. Jeppe a dit que le système était compter les instances de
ProcessThread
alors que votre code tente d'attribuer une classe à une variable:C'est tout simplement le code non valide. Le message d'erreur indique que le compilateur réalise que c'est le nom d'un type, mais vous ne pouvez pas attribuer un nom de type à une variable.
Fait. Voir mon edit.
diagThreadCount=System.Diagnostics.ProcessThread
n'est pas le code complet, je ne pouvais pas le finir depuis Intellisense et le compilateur signale une erreur et refuse l'utilisation deProcessThread
Le compilateur t trouver le
ProcessThread
classe, sinon il n'aurait pas fait une erreur de "nom de la Classe n'est pas valide à ce stade". Mais il n'y a pas de membres statiques deProcessThread
, donc rien pour Intellisense suggérer. Il n'est pas clair ce que vous essayez d'atteindre avecProcessThread
de toute façon.pour voir ce qui est mentionné "le comte de Système.Diagnostics.ProcessThread", quelle est la différence.. Comment l'utiliser?
OriginalL'auteur Jon Skeet