2009-12-02 3 views
0

Comment exactement un Handle se rapporte-t-il à un thread? J'écris un service qui accepte une requête HTTP et appelle une méthode avant de retourner une réponse. J'ai écrit un client de test qui envoie 10 000 requêtes HTTP (en utilisant un sémaphore pour s'assurer que seulement 1000 demandes sont faites à la fois).Comment un Handle se rapporte-t-il à un thread?

Si j'appelle la méthode (la méthode traitée avant de renvoyer une réponse) via le ThreadPool, ou via une action générique <T> .BinInInvoke, les poignées du service vont monter et rester là jusqu'à ce que toute la requête soit terminée, mais le nombre de threads du service reste à peu près mort. Cependant, si j'appelle la méthode de manière synchrone avant de renvoyer la réponse, le nombre de threads augmentera, mais le nombre de handles passera par des pics et des vallées extrêmes.

C'est C# sur une machine Windows (Server 2008)

Répondre

0

Vous pouvez penser à une poignée comme une abstraction d'un pointeur. Il y a beaucoup de choses dans Windows qui utilisent des handles (quand vous ouvrez un fichier au niveau de l'API, vous obtenez un handle pour le fichier, quand vous créez une fenêtre, la fenêtre a un handle, un thread a un handle, etc). Ainsi, votre nombre de handles a probablement à voir avec les opérations qui se produisent sur vos threads. Si vous avez plus de threads en cours d'exécution, plus de choses se passent en même temps, de sorte que vous verrez plus de poignées ouvertes.

1

Votre description est trop vague pour donner un bon diagnostic. Mais le ThreadPool a été conçu pour limiter le nombre de threads actifs. Cela évitera d'avoir plus de threads que de cœurs de CPU. Ce n'est que lorsqu'un thread est "coincé" qu'il va programmer un thread supplémentaire. Cela explique pourquoi vous voyez le nombre de threads ne pas augmenter de façon extravagante. Et, indirectement, pourquoi le nombre de handles reste stable car la machine fait moins de travail.

Questions connexes