Hallo,
ich starte in meinem Programm eine Methode, in der 5 mal eine weitere Methode in 5 Threads gestartet wird:
Thread[] tArray = new Thread[5];
tArray[0] = new Thread(new ThreadStart(prepareImage));
tArray[1] = new Thread(new ThreadStart(prepareImage));
tArray[2] = new Thread(new ThreadStart(prepareImage));
tArray[3] = new Thread(new ThreadStart(prepareImage));
tArray[4] = new Thread(new ThreadStart(prepareImage));
tArray[0].Start();
tArray[1].Start();
tArray[2].Start();
tArray[3].Start();
tArray[4].Start();
In der Methode werden in einer Endlosschleife Bitmaps aus einer Input-Queue gelesen, bearbeitet und in eine Output-Queue geschrieben. Mit wenig Bitmaps in der Input-Queue und nur 2 Threads funktioniert alles, wenn auch nicht besonders schnell. Sobald ich die Anzahl der Threads erhöhe, oder insgesammt mehr Bitmaps bearbeiten lasse kommt folgende Meldung:
ContextSwitchDeadlock wurde erkannt.
Message: Die CLR konnte 60 Sekunden lang keinen Übergang vom COM-Kontext 0x2c32f90 zum COM-Kontext 0x2c331e0 durchführen. Der Thread, der Besitzer des Zielkontexts/-apartments ist, wartet entweder, ohne Meldungen zu verschieben, oder verarbeitet eine äußerst lang dauernde Operation, ohne Windows-Meldungen zu verschieben. Eine solche Situation beeinträchtigt in der Regel die Leistung und kann sogar dazu führen, dass die Anwendung nicht mehr reagiert oder die Speicherauslastung immer weiter zunimmt. Zur Vermeidung dieses Problems sollten alle STA-Threads (Singlethread-Apartment) primitive Typen verwenden, die beim Warten Meldungen verschieben (z.B. CoWaitForMultipleHandles), und bei lange dauernden Operationen generell Meldungen verschieben.
Was bedeutet die Exception und wie behebe ich den Fehler?
ich starte in meinem Programm eine Methode, in der 5 mal eine weitere Methode in 5 Threads gestartet wird:
Thread[] tArray = new Thread[5];
tArray[0] = new Thread(new ThreadStart(prepareImage));
tArray[1] = new Thread(new ThreadStart(prepareImage));
tArray[2] = new Thread(new ThreadStart(prepareImage));
tArray[3] = new Thread(new ThreadStart(prepareImage));
tArray[4] = new Thread(new ThreadStart(prepareImage));
tArray[0].Start();
tArray[1].Start();
tArray[2].Start();
tArray[3].Start();
tArray[4].Start();
In der Methode werden in einer Endlosschleife Bitmaps aus einer Input-Queue gelesen, bearbeitet und in eine Output-Queue geschrieben. Mit wenig Bitmaps in der Input-Queue und nur 2 Threads funktioniert alles, wenn auch nicht besonders schnell. Sobald ich die Anzahl der Threads erhöhe, oder insgesammt mehr Bitmaps bearbeiten lasse kommt folgende Meldung:
ContextSwitchDeadlock wurde erkannt.
Message: Die CLR konnte 60 Sekunden lang keinen Übergang vom COM-Kontext 0x2c32f90 zum COM-Kontext 0x2c331e0 durchführen. Der Thread, der Besitzer des Zielkontexts/-apartments ist, wartet entweder, ohne Meldungen zu verschieben, oder verarbeitet eine äußerst lang dauernde Operation, ohne Windows-Meldungen zu verschieben. Eine solche Situation beeinträchtigt in der Regel die Leistung und kann sogar dazu führen, dass die Anwendung nicht mehr reagiert oder die Speicherauslastung immer weiter zunimmt. Zur Vermeidung dieses Problems sollten alle STA-Threads (Singlethread-Apartment) primitive Typen verwenden, die beim Warten Meldungen verschieben (z.B. CoWaitForMultipleHandles), und bei lange dauernden Operationen generell Meldungen verschieben.
Was bedeutet die Exception und wie behebe ich den Fehler?