ContextSwitchDeadlock-Exception beim verwenden von mehreren Threads

Werner83

Grünschnabel
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?
 
Kommt die Meldung beim Debuggen?
Zumindest hatte ich diese immer da wenn ich längere Zeit im Debuggen nichts getan habe, diese Meldung kannst du im Studio abschalten.
Unter: Debug -> Exceptions -> Manage Debugging Assistants -> ContextSwitchDeadlock den Hacken raus
 
Die Meldung kommt nicht nur beim debuggen, sondern auch wenn ich das Programm laufen lasse. Es wundert mich auch, dass das Programm die Bitmaps nicht schneller schneller bearbeitet, als wenn ich die Methode sequenziell in einer schleife aufrufe.
 
Wenn du nur einen Prozessor hast, dann sind mehrere Tasks nicht schneller als ein einziger. Denn woher sollte die Geschwindigkeit kommen? Multithreading ist erst interessant, wenn du auch tatsächlich mehrere Prozessoren hast.
 
Ist richtig, ich nutze aber einen Doppelkern-Prozessoer und die CPU-Auslastung ist bei der sequenziellen Bearbeitung bei 50%, während sie bei der Bearbeitung mit Threads bei 100% liegt.
 
Zurück