D'autres réponses ici semblent être en laissant le point le plus important:
Sauf si vous essayez de paralléliser un CPU-intensive afin d'arriver plus vite sur une faible charge du site, il n'y a pas de point à l'aide d'un thread de travail.
Cela vaut pour les deux threads libres, créé en new Thread(...)
, et les threads de travail dans l' ThreadPool
qui répondent à l' QueueUserWorkItem
des demandes.
Oui, c'est vrai, vous pouvez mourir de faim l' ThreadPool
dans un ASP.NET processus de mise en file d'attente trop d'éléments de travail. Elle permettra d'éviter ASP.NET de traitement des nouvelles demandes. Les informations contenues dans l'article est précis à cet égard; le même pool de threads utilisés pour QueueUserWorkItem
est également utilisé pour traiter les requêtes.
Mais si vous êtes réellement files d'attente suffisamment d'éléments de travail à cause de cette famine, alors vous devriez mourir de faim, le pool de threads! Si vous exécutez littéralement des centaines de CPU-intensive opérations en même temps, à quoi bon faire pour avoir un autre thread de travail pour servir ASP.NET demande, lorsque la machine est déjà surchargé? Si vous êtes en cours d'exécution dans cette situation, vous avez besoin de redessiner complètement!
La plupart du temps je les voir ou de les entendre parler de multi-threaded code utilisé de façon inappropriée dans ASP.NET il n'est pas pour les les d'attente CPU-intensive de travail. C'est pour les les d'attente d'e/S de travail. Et si vous voulez faire des I/O de travail, alors vous devriez être en utilisant un thread d'e/S (I/O Port d'Achèvement).
Plus précisément, vous devriez être en utilisant la async rappels pris en charge par quoi que ce soit de la bibliothèque de la classe que vous utilisez. Ces méthodes sont toujours très clairement étiquetés; ils commencent avec les mots - Begin
et End
. Comme en Stream.BeginRead
, Socket.BeginConnect
, WebRequest.BeginGetResponse
, et ainsi de suite.
Ces méthodes ne utiliser l' ThreadPool
, mais ils utilisent IOCPs, qui ne pas interférer avec ASP.NET les demandes. Ils sont un type spécial de thread léger qui peut être "réveillé" par un signal d'interruption d'e/S du système. Et dans un ASP.NET application, vous avez normalement un thread d'e/S pour chaque thread de travail, de sorte que chaque demande unique peut avoir une opération asynchrone en file d'attente. C'est littéralement des centaines d'opérations asynchrones, sans une dégradation significative des performances (en supposant que l'I/O sous-système permet de conserver jusqu'). C'est beaucoup plus que vous aurez jamais besoin.
Il suffit de garder à l'esprit que async délégués ne fonctionnent pas de cette façon - ils vont finir par en utilisant un thread de travail, tout comme ThreadPool.QueueUserWorkItem
. C'est seulement le haut-méthodes asynchrones de la .NET Framework bibliothèque de classes qui sont capables de faire cela. Vous pouvez le faire vous-même, mais c'est compliqué et un peu dangereux et probablement au-delà de la portée de cette discussion.
La meilleure réponse à cette question, à mon avis, est de ne pas utiliser l' ThreadPool
ou un arrière-plan Thread
instance dans ASP.NET. Ce n'est pas du tout comme filer un fil dans une application Windows Forms, où vous faire pour conserver l'INTERFACE utilisateur réactive et ne se soucient pas de la façon dont elle est efficace. Dans ASP.NET, votre préoccupation est le débit, et tout ce que la commutation de contexte sur tous les threads de travail est absolument va tuer votre débit si vous utilisez l' ThreadPool
ou pas.
S'il vous plaît, si vous trouvez vous-même l'écriture de filetage code de ASP.NET - examiner si oui ou non il pourrait être réécrit pour utiliser les pré-existantes des méthodes asynchrones, et si il ne peut pas, alors s'il vous plaît examiner si oui ou non vous avez vraiment, vraiment besoin du code à exécuter dans un thread d'arrière-plan. Dans la majorité des cas, vous serez probablement en ajoutant de la complexité pour aucun bénéfice net.