Aplikace konzoly, který je založen na STA může zpozdit vydání součásti COM a může zpozdit volání metody Finalize objekty shromažďuje nesmyslné kolekcí

Překlady článku Překlady článku
ID článku: 828988 - Produkty, které se vztahují k tomuto článku.
Rozbalit všechny záložky | Minimalizovat všechny záložky

Příznaky

Pokud aplikace konzoly, který je založen na jedním podprocesem apartment (STA) vytvoří a používá STA komponent model (COM) a aplikace konzoly provedení dostatečná operací Pumpa zprávy COM, jako je například volání metody Monitor.Enter metoda Thread.Join a ostatními, může nastat následující příznaky. Pokud aplikace konzoly provádí operace, které, spustit dlouhou dobu a není, Pumpa zpráv, například volání metody Console.ReadLine může také dojít následující příznaky:
  • Vydání součásti COM mohou být zpožděny.
  • Volání metody Finalize objekty shromažďuje kolekcí uvolnění paměti může být zpožděna.
  • Volání komponenty COM může blokovat podprocesu aplikace pro delší období.
  • Časem může zvýšit množství paměti, který používá proces STA aplikace.
  • Volání metody GC.WaitForPendingFinalizers může trvat dlouho vrátit.

Příčina

Volání komponenty STA COM doručit správně, včetně volání komponenty, uvolněte musí podproces, kde byla vytvořena součást čerpání zprávy. Při spravovaný kód již odkazuje součást COM, podproces finalizer třeba zavolat metodu Release součásti. Však pokud podproces STA, kde byla vytvořena součást není čerpání zprávy, bloky volání aplikace dokud podprocesu začne znovu čerpání zprávy. Některé aplikace vytvářejí velké množství komponenty COM a objekty, které mohou být dokončeny. V těchto aplikacích Pokud podproces finalizer stráví šarže času blokován, zatímco čeká STA podprocesu čerpadlo zpráv, podproces finalizer pravděpodobně nebude moci dokončit jeho činnosti. V seznamu com součásti vydání a seznamu Spravované objekty Finalizovat může narůstat neomezeně dlouho. Pokud k tomuto problému dojde, může zvýšit množství paměti, který používá proces aplikace STA časem. Podproces, který volá metodu GC.WaitForPendingFinalizers také může blokovat neomezeně dlouho.

Operace (IO) souboru a konzoly vstupu a výstupu operačního systému, například funkci ReadFile a WriteFile není Pumpa zprávy. Protože Console.ReadLine závisí na funkci ReadFile API operačního systému, provede Console.ReadLine buď není čerpadlo zpráv. Podproces, který volá Console.ReadLine tedy není Pumpa zpráv během volání.

Řešení

Chcete-li tento problém vyřešit, použijte MTA podprocesů namísto podprocesů STA vytvořit a komunikovat s součásti COM v aplikace konzoly. Můžete nastavit hlavní podproces aplikace MTA. Použít System.MTAThread hlavní metody následující atribut:
public class ConsoleApplication
             {
                 [MTAThread]
                 static void Main()
                 {
                     // Add your code here.
                     Console.ReadLine();
                 }
} 
používáte musí podprocesů STA vytvoření součásti COM, podprocesů STA musí Pumpa zprávy pravidelně. Pumpa zprávy krátkou dobu, způsobem volat metodu Thread.Join:
Thread.CurrentThread.Join(100)
toto volání metody pumps zprávy 100 milisekund. Můžete upravit požadavky aplikace na základě časového limitu. Také STA podproces má provádět nikdy neomezeno operace bez čerpání, jako je například volání Console.ReadLine. Podproces STA místo toho musí mít podproces MTA provedení operace a počkejte na dokončení operace.

Odkazy


Další informace o vzdálené komunikace Microsoft .NET Framework naleznete na následujícím webu:
http://msdn2.microsoft.com/en-us/library/1912sb9w(vs.71).aspx
Další informace o uvolnění paměti generace .NET Framework navštivte následující weby:
http://msdn.microsoft.com/msdnmag/issues/1100/gci/
http://msdn.microsoft.com/msdnmag/issues/1200/GCI2/

Další informace o blokování volání z STA součásti klepněte na následující číslo článku databáze Microsoft Knowledge Base:
291837INFORMACE: Není volání blokování z STA součásti

Vlastnosti

ID článku: 828988 - Poslední aktualizace: 9. února 2004 - Revize: 1.4
Informace v tomto článku jsou určeny pro produkt:
  • Microsoft .NET Framework 1.1
  • Microsoft .NET Framework 1.0
Klíčová slova: 
kbmt kbgarbagecollect kbremoting kbprb KB828988 KbMtcs
Strojově přeložený článek
Důležité: Tento článek byl přeložen pomocí software společnosti Microsoft na strojový překlad, ne profesionálním překladatelem. Společnost Microsoft nabízí jak články přeložené překladatelem, tak články přeložené pomocí software na strojový překlad, takže všechny články ve Znalostní databázi (Knowledge Base) jsou dostupné v češtině. Překlad pomocí software na strojový překlad ale není bohužel vždy dokonalý. Obsahuje chyby ve skloňování slov, skladbě vět, nebo gramatice, podobně jako když cizinci dělají chyby při mluvení v češtině. Společnost Microsoft není právně zodpovědná za nepřesnosti, chyby nebo škody vzniklé chybami v překladu, nebo při použití nepřesně přeložených instrukcí v článku zákazníkem. Společnost Microsoft aktualizuje software na strojový překlad, aby byl počet chyb omezen na minimum.
Projděte si také anglickou verzi článku:828988

Dejte nám zpětnou vazbu

 

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