Une application de console qui repose sur un STA peut retarder la version de composants COM et peut différer les appels aux méthodes Finalize des objets qui rassemble le garbage collector

Traductions disponibles Traductions disponibles
Numéro d'article: 828988 - Voir les produits auxquels s'applique cet article
Agrandir tout | Réduire tout

Symptômes

Si une application de console qui repose sur un STA (single-threaded apartment crée et utilise ensuite les composants COM (Component Object Model) STA et l'application de console n'effectue pas suffisantes opérations pompe messages COM, telles que l'appel de la méthode Monitor.Enter , la méthode Thread.Join et d'autres personnes, les symptômes suivants peuvent se produire. En outre, si l'application de console effectue les opérations qui s'exécutent pendant une longue période et qui ne pompe pas les messages, telles que l'appel de la méthode Console.ReadLine les symptômes suivants peuvent se produire :
  • La version de composants COM peut-être être retardée.
  • Les appels aux méthodes Finalize des objets qui rassemble le garbage collector peuvent être retardées.
  • Appels aux composants COM peuvent bloquer le thread d'application pour les périodes étendues.
  • Le montant de mémoire que le processus d'application STA utilise peut augmenter progressivement.
  • Appels de la méthode GC.WaitForPendingFinalizers peuvent prendre du temps à renvoyer.

Cause

Pour remettre un appel à un composant COM STA correctement, y compris un appel à lancer le composant, le thread où le composant a été créé doit pompage messages. Lorsque le code géré plus fait référence à un composant COM, le thread finaliseur doit appeler la méthode version du composant. Toutefois, si le thread STA dans lequel le composant a été créé est non pompage des messages, les blocs d'appel de l'application jusqu'à ce que le thread commence pompage des messages à nouveau. Certaines applications créer beaucoup de composants COM et d'objets qui peuvent être finalisés. Dans ces applications, si le thread finaliseur passe beaucoup de temps bloqué pendant qu'il attend le STA thread pompe messages, le thread finaliseur pas pourrez terminer son activité. À la fois la liste de COM composants afin de version et la liste d'objets gérés pour finaliser peuvent croître indéfiniment. Si ce problème se produit, le montant de mémoire que le processus d'application STA utilise peut augmenter progressivement. En outre, n'importe quel thread qui appelle la méthode GC.WaitForPendingFinalizers peut bloquer indéfiniment.

Les opérations de (e / S) d'entrée/sortie fichier et console du système d'exploitation, tels que ReadFile et WriteFile , ne pompe pas les messages. Étant donné que Console.ReadLine repose sur l'API ReadFile du système d'exploitation, Console.ReadLine ne soit pas les messages de pompe. Par conséquent, n'importe quel thread qui appelle Console.ReadLine ne pompe pas messages pendant l'appel.

Résolution

Pour résoudre ce problème, utilisez threads MTA au lieu de threads STA pour créer et communiquer avec les composants COM dans les applications de console. Vous pouvez définir le thread principal de l'application à un agent de transfert des messages. Pour cela, appliquez la System.MTAThread attribuer à la méthode main, comme suit : classe publique
public class ConsoleApplication
             {
                 [MTAThread]
                 static void Main()
                 {
                     // Add your code here.
                     Console.ReadLine();
                 }
} 
Console.ReadLine();}} si vous devez utilisez threads STA pour créer des composants COM, les threads STA doivent pompe messages régulièrement. Pompe messages pour une courte période, appelez la méthode Thread.Join , comme suit :
Thread.CurrentThread.Join(100)
cet appel de méthode pompe messages de 100 millisecondes. Vous pouvez modifier le délai d'expiration en fonction des besoins de l'application. En outre, le STA thread doit exécuter jamais des illimitée opérations sans pompage, telle qu'appeler Console.ReadLine . Au lieu de cela, le thread STA doit être un thread MTA effectuer l'opération et puis attendez que l'opération à terminer.

Références


Pour plus d'informations sur Microsoft .NET Framework remoting, reportez-vous au site de Web Microsoft suivant :
http://msdn2.microsoft.com/en-us/library/1912sb9w(vs.71).aspx
Pour plus d'informations sur garbage collection dans le .NET Framework, reportez-vous au adresse aux sites Web de Microsoft aux adresses suivantes :
http://msdn.microsoft.com/msdnmag/issues/1100/gci/
http://msdn.microsoft.com/msdnmag/issues/1200/GCI2/

Pour plus d'informations sur le blocage appels provenant d'un composant STA, cliquez sur le numéro ci-dessous pour afficher l'article correspondant dans la Base de connaissances Microsoft :
291837 INFO : ne pas effectuer des blocage appels à partir d'un composant STA

Propriétés

Numéro d'article: 828988 - Dernière mise à jour: lundi 9 février 2004 - Version: 1.4
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft .NET Framework 1.1
  • Microsoft .NET Framework 1.0
Mots-clés : 
kbmt kbgarbagecollect kbremoting kbprb KB828988 KbMtfr
Traduction automatique
IMPORTANT : Cet article est issu du système de traduction automatique mis au point par Microsoft (http://support.microsoft.com/gp/mtdetails). Un certain nombre d?articles obtenus par traduction automatique sont en effet mis à votre disposition en complément des articles traduits en langue française par des traducteurs professionnels. Cela vous permet d?avoir accès, dans votre propre langue, à l?ensemble des articles de la base de connaissances rédigés originellement en langue anglaise. Les articles traduits automatiquement ne sont pas toujours parfaits et peuvent comporter des erreurs de vocabulaire, de syntaxe ou de grammaire (probablement semblables aux erreurs que ferait une personne étrangère s?exprimant dans votre langue !). Néanmoins, mis à part ces imperfections, ces articles devraient suffire à vous orienter et à vous aider à résoudre votre problème. Microsoft s?efforce aussi continuellement de faire évoluer son système de traduction automatique.
La version anglaise de cet article est la suivante: 828988
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.

Envoyer des commentaires

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com