7
votes

Combien de threads «STA» peuvent coexister à l'intérieur d'un processus?

J'ai besoin de multiples STA sur ma application ASP.NET pour utiliser des composants com .

J'ai lu quelque part dans chaque processus, un seul fil STA peut exister. J'ai codé un exemple de projet et j'ai fait de nombreux threads et définit son état d'appartement sur STA et ils fonctionnent avec com d'objets sans aucune exception.

est-il possible d'avoir de nombreux STA à l'intérieur d'un processus?


4 Réponses :


4
votes

Si votre programme fonctionne avec de nombreux threads STA, alors pourquoi demandez-vous si cela fonctionne? :) .NET vous permet d'avoir un nombre quelconque de fils STA, de sorte qu'il doit fonctionner. Ce que vous lisez peut être vrai pour des applications natales typiques avec un seul fil principal et une boucle de message, cependant.


0 commentaires

4
votes

Il n'y a pas de limite supérieure, autre que la mémoire. Un processus de 32 bits calera normalement un peu plus timide de 2000 threads lorsque les piles des threads ont consommé tous les espaces d'adresses disponibles.

Gardez les règles à l'esprit, vous ne pouvez pas appeler un objet créé dans une STA d'une autre STA sans le maréchalage. Et n'oubliez pas la boucle de message requise, un thread de STA doit pomper pour maintenir le maréchalage vivant et empêcher l'impasse. De toute évidence, d'obtenir n'importe où près de la limite de mémoire devrait être fortement évitée.


0 commentaires

7
votes

Il n'y a pas de limite inhérente au nombre de threads STA que vous pouvez avoir, mais vous voudrez probablement imposer une telle limite sur votre propre.

Si vous autorisez votre application ASP.NET à créer des threads STA supplémentaires lorsque de nouvelles demandes utilisateur arrivent, sans la limiter, le nombre de threads entraînera finalement que les performances de votre application se détériorent comme la durée dépensée par la CPU sur le passage de la CPU devient trop élevé. Cela rend également votre application beaucoup plus vulnérable aux attaques de signification des services.

Vous pouvez envisager une conception si vous avez défini une limite pour le nombre de threads STA en fonction de votre profil matériel ou d'utilisateurs, et une fois la limite atteinte, mettez en œuvre une mise en commun pour réutiliser des threads STA existants pour servir de nouvelles demandes. < / p>


3 commentaires

+1 pour limiter la création de thread. Exactement le genre de chose qui vous mordra dans la production.


J'y envisagé d'utiliser une piscine thread-piscine, mais peut-être définir un type d'appartement d'un fil de fil-piscine fait un problème car un type d'appartement de fil ne peut pas changer plus d'une fois.


Si je me souviens bien, les threads Threadpool sont toujours MTA. Quoi qu'il en soit, ce serait probablement une très mauvaise idée d'utiliser Threadpool pour les objets STA COM. Les threads STA doivent pomper des messages et des threads Threadpools ne pompe pas après avoir terminé l'élément de travail que vous avez mis en file d'attente. La création d'un objet STA COM sur ThreadPool peut même que le fil du finaliseur soit bloqué, ce qui peut entraîner des fuites de mémoire.



0
votes

Il n'y a pas de limite réelle sur le fil STA standard, mais il n'y a qu'un seul thread STA de «spécial» pour l'interface utilisateur qui a la boucle de message. Cela peut être ce que vous avez lu ailleurs. Bien que la plupart des comes conviennent à n'importe quel fil de STA, certains COMPS peuvent nécessiter la boucle de message (telle que pour le ticking de la minuterie) qui nécessitera de pointer sur le thread de l'interface utilisateur ou le pompage des messages.

est une boucle de message STA requise dans ce cas?

http://blogs.msdn.com /b/cbrumme/archive/2004/02/02/66219.aspx


0 commentaires