2010-02-08 16 views
5

ich ein Programm, das ich laufen und in der Mitte erhalte ich diese Meldung:seltsame Nachricht über Threads in C#

Managed Debugging-Assistent ‚ContextSwitchDeadlock‘ ein Problem in ‚C erkannt hat: \ Dokumente und Einstellungen \ Lena G \ Eigene Dateien \ SchoolStuff \ IR Information \ Home \ FianlProject \ finalProject \ finalProject \ bin \ Debug \ finalProject.vshost.exe '. Weitere Informationen: Die CLR konnte für 60 Sekunden nicht vom COM-Kontext 0x3407968 zum COM-Kontext 0x3407ad8 übergehen. Der Thread, der den Zielkontext/das Zielobjekt besitzt, führt höchstwahrscheinlich entweder eine nicht pumpende Wartezeit durch oder verarbeitet eine sehr lange laufende Operation, ohne Windows-Nachrichten zu pumpen. Diese Situation wirkt sich im Allgemeinen negativ auf die Leistung aus und kann sogar dazu führen, dass die Anwendung nicht mehr reagiert oder sich die Speicherbelegung im Laufe der Zeit ständig erhöht. Um dieses Problem zu vermeiden, sollten alle STA-Threads (single threaded apartments) Pump-Warte-Primitive (wie CoWaitForMultipleHandles) verwenden und während langer Betriebsvorgänge routinemäßig Nachrichten pumpen.

Ich verstehe, dass es etwas mit der Tatsache zu tun hat, dass es für 60 Sekunden ohne anzuhalten oder so etwas läuft? Wie ist es ein Problem? Ich habe auch [STAThread] vor dem Haupt meines Programms, denn wenn ich es entfernen dann es mir diese Meldung zeigt:

Eine nicht behandelte Ausnahme des Typs ‚System.Threading.ThreadStateException‘ in System.Windows.Forms.dll aufgetreten Weitere Informationen: Aktueller Thread muss auf Single Thread Apartment (STA) -Modus festgelegt werden, bevor OLE-Aufrufe vorgenommen werden können. Stellen Sie sicher, dass die Main-Funktion STAThreadAttribute enthält. Diese Ausnahme wird nur ausgelöst, wenn ein Debugger an den Prozess angehängt ist.

Wer weiß, wie ich dieses Problem lösen kann?

Vielen Dank im Voraus,

Lena

Antwort

1

Es ist eine Warnung, die generiert wird, wenn Sie ein ActiveX-Objekt von einem Hintergrundthread aufrufen und Ihr Hauptthread blockiert wird. Vielleicht eher: Es gab einen Fehler in der Verkaufsversion von Visual Studio 2005, der diese Warnung ohne triftigen Grund ausgelöst hat. Es wurde in Service Pack 1 behoben, stellen Sie sicher, dass Sie das installiert haben. Noch eine andere Problemumgehung ist es, den Mund zu halten. Debuggen + Ausnahmen, Verwaltete Debugging-Assistenten, deaktivieren Sie die ContextSwitchDeadlock-Warnung. Aber verwenden Sie SP1, wenn Sie es nicht haben.

+0

Wenn ich den Context Switch Deadlock ausschalten, kann es Schaden anrichten? Ich benutze Visual Studio 2008 .. –

+0

Nichts wird explodieren. Sie könnten tatsächlich einen Deadlock haben. Du wirst schnell genug herausfinden, dein Programm wird einfrieren. –

2

Sie müssen sicherstellen, dass Ihre Thread, der die COM-Komponente besitzt wird über die Verarbeitung nicht „eingesperrt“> 60 Sekunden.

Was wahrscheinlich passiert ist, dass Sie ein COM-Objekt in einem Formular haben, und Sie arbeiten an dem UI-Thread. Wenn Ihre Benutzeroberfläche für> 60 Sekunden von der Verarbeitung blockiert wird, kann sich die COM-Komponente beschweren. Verwenden Sie eine BackgroundWorker Instanz, um Ihren lang andauernden Prozess zu verarbeiten. Dies würde die Arbeit auf einen Hintergrundthread verschieben und es der COM-Komponente ermöglichen, Nachrichten ohne Beschwerden zu verarbeiten.