ERLEDIGT
NEIN
NEIN
ANTWORTEN
4
4
ZUGRIFFE
1267
1267
EMPFEHLEN
-
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.
hihi = -h²
-
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.
Ähnliche Themen
-
List von mehreren Threads abarbeiten lassen
Von stevetc im Forum Algorithmen & Datenstrukturen mit JavaAntworten: 0Letzter Beitrag: 30.09.09, 15:06 -
Globales Objekt in mehreren Threads verwenden?
Von Pain-maker im Forum C/C++Antworten: 7Letzter Beitrag: 11.06.09, 21:54 -
[C] Liste sortieren. Threads verwenden?
Von KeDaiv im Forum C/C++Antworten: 9Letzter Beitrag: 02.11.08, 00:13 -
SWT mehrere Threads verwenden
Von bigJ01 im Forum Swing, Java2D/3D, SWT, JFaceAntworten: 7Letzter Beitrag: 28.02.05, 09:44 -
Methode von mehreren Threads verwenden
Von michaelu im Forum .NET ArchivAntworten: 1Letzter Beitrag: 22.01.04, 13:04





Zitieren
Login





