Eine Konsolenanwendung, die auf eine STATION basiert möglicherweise verzögert der Freigabe von COM-Komponenten und möglicherweise verzögert Aufrufe Finalize-Methoden der Objekte, die der Garbage Collector erfasst

SPRACHE AUSWÄHLEN SPRACHE AUSWÄHLEN
Artikel-ID: 828988 - Produkte anzeigen, auf die sich dieser Artikel bezieht
Alles erweitern | Alles schließen

Problembeschreibung

Wenn eine Konsolenanwendung, die auf einem Singlethread-Apartment (STA) basiert erstellt und verwendet dann STA Component Object Model (COM) Komponenten und die Konsolenanwendung keine ausreichende Operationen führt an COM-Nachrichten, wie z. B. die Monitor.Enter -Methode, die Thread.Join -Methode und andere Pumpe können die folgenden Symptome auftreten. Darüber hinaus können die Konsolenanwendung führt Operationen, die für einen langen Zeitraum ausgeführt und, führen Sie keine Meldungen, z. B. die Console.ReadLine -Methode aufrufen Pumpe, die folgenden Symptome auftreten:
  • Die Version von COM-Komponenten möglicherweise verzögert werden.
  • Die Aufrufe der Finalize -Methoden Objekte, die der Garbage Collector sammelt möglicherweise verzögert werden.
  • Aufrufe an COM-Komponenten möglicherweise-Thread den Anwendung für einen längeren Zeitraum blockiert.
  • Der Speicher, die der STA-Anwendungsprozess verwendet möglicherweise Zeit erhöht.
  • Aufrufe der GC.WaitForPendingFinalizers -Methode können eine lange zurückgeben dauern.

Ursache

Einen Aufruf an einen STA-COM-Komponente richtig, einschließlich ein Aufruf an die Komponente freigeben übermitteln muss der Thread, in dem die Komponente erstellt wurde, Nachrichten pumping. Wenn der verwaltete Code nicht mehr eine COM-Komponente verweist, muss der Finalizerthread die Release -Methode der Komponente aufrufen. Wenn jedoch der STA-Thread, in dem die Komponente erstellt wurde, keine Nachrichten pumping ist, beginnt der Aufruf blockiert die Anwendung, bis der Thread pumping Nachrichten erneut. Einige Anwendungen erstellen viele COM-Komponenten und Objekte, die beendet werden können. In diesen Anwendungen wenn der Finalizerthread viel verbringt Zeit gesperrt, während er darauf die STATION wartet Pumpe Nachrichten thread, der Finalizerthread möglicherweise nicht Ihre Aktivität abschließen. Beide die Liste der COM-Komponenten Freigabe und die Liste der verwalteten Objekte zum Abschließen können anwachsen unbegrenzt. Wenn dieses Problem auftritt, kann der Speicher, die der STA-Anwendungsprozess verwendet Zeit vergrößern. Darüber hinaus kann jeder Thread, der die GC.WaitForPendingFinalizers -Methode aufruft, auf unbestimmte Zeit blockiert werden.

Die Datei und Konsole Eingabe/Ausgabe (e/A)-Vorgänge des Betriebssystems wie ReadFile und WriteFile , führen Sie nicht Nachrichten Pumpe. Da Console.ReadLine der ReadFile-API des Betriebssystems abhängig ist, wird Console.ReadLine entweder keine Pumpe Nachrichten. Daher wird jeder Thread, der Console.ReadLine aufruft nicht Nachrichten während des Aufrufs Pumpe.

Lösung

Um dieses Problem zu beheben, verwenden Sie MTA-Threads anstelle von STA-Threads erstellen und mit COM-Komponenten in Konsolenanwendungen zu kommunizieren. Sie können den Hauptthread der Anwendung in einem MTA festlegen. Hierzu zuweisen System.MTAThread -Attribut auf die main-Methode wie folgt:
public class ConsoleApplication
             {
                 [MTAThread]
                 static void Main()
                 {
                     // Add your code here.
                     Console.ReadLine();
                 }
} 
Wenn Sie STA-Threads zum Erstellen von COM-Komponenten verwenden müssen, die STA-Threads müssen Pumpe Nachrichten regelmäßig. Pumpe Nachrichten für kurze Zeit, rufen Sie die Thread.Join -Methode, wie folgt:
Thread.CurrentThread.Join(100)
dieser Methodenaufruf verteilt Nachrichten für 100 Millisekunden. Sie können das Timeout entsprechend den Anforderungen der Anwendung anpassen. Darüber hinaus die STATION Thread sollte nie Operationen unbounded nicht pumping, wie Console.ReadLine aufrufen. Stattdessen benötigen STA-Thread einen MTA-Thread den Vorgang ausführen und warten Sie auf den Vorgang abzuschließen.

Informationsquellen


Weitere Informationen zu Microsoft .NET Framework Remoting der folgenden Microsoft-Website:
http://msdn2.microsoft.com/en-us/library/1912sb9w(vs.71).aspx
Finden Sie weitere Informationen zum Garbagecollection in .NET Framework auf der folgenden Microsoft-Websites:
http://msdn.microsoft.com/msdnmag/issues/1100/gci/
http://msdn.microsoft.com/msdnmag/issues/1200/GCI2/

Weitere Informationen über blockierende Aufrufe von einer STA-Komponente finden Sie die folgende KB-Artikelnummer:
291837INFO: Machen Sie nicht blockierende Aufrufe von einer STATION Komponente

Eigenschaften

Artikel-ID: 828988 - Geändert am: Montag, 9. Februar 2004 - Version: 1.4
Die Informationen in diesem Artikel beziehen sich auf:
  • Microsoft .NET Framework 1.1
  • Microsoft .NET Framework 1.0
Keywords: 
kbmt kbgarbagecollect kbremoting kbprb KB828988 KbMtde
Maschinell übersetzter Artikel
Wichtig: Dieser Artikel wurde maschinell und nicht von einem Menschen übersetzt. Die Microsoft Knowledge Base ist sehr umfangreich und ihre Inhalte werden ständig ergänzt beziehungsweise überarbeitet. Um Ihnen dennoch alle Inhalte auf Deutsch anbieten zu können, werden viele Artikel nicht von Menschen, sondern von Übersetzungsprogrammen übersetzt, die kontinuierlich optimiert werden. Doch noch sind maschinell übersetzte Texte in der Regel nicht perfekt, insbesondere hinsichtlich Grammatik und des Einsatzes von Fremdwörtern sowie Fachbegriffen. Microsoft übernimmt keine Gewähr für die sprachliche Qualität oder die technische Richtigkeit der Übersetzungen und ist nicht für Probleme haftbar, die direkt oder indirekt durch Übersetzungsfehler oder die Verwendung der übersetzten Inhalte durch Kunden entstehen könnten.
Den englischen Originalartikel können Sie über folgenden Link abrufen: 828988
Microsoft stellt Ihnen die in der Knowledge Base angebotenen Artikel und Informationen als Service-Leistung zur Verfügung. Microsoft übernimmt keinerlei Gewährleistung dafür, dass die angebotenen Artikel und Informationen auch in Ihrer Einsatzumgebung die erwünschten Ergebnisse erzielen. Die Entscheidung darüber, ob und in welcher Form Sie die angebotenen Artikel und Informationen nutzen, liegt daher allein bei Ihnen. Mit Ausnahme der gesetzlichen Haftung für Vorsatz ist jede Haftung von Microsoft im Zusammenhang mit Ihrer Nutzung dieser Artikel oder Informationen ausgeschlossen.

Ihr Feedback an uns

 

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