| 

.NET C# Java Javascript Exception

1
Moin,

ich stehe gerade ein wenig auf dem Schlauch.

Ich hab mein Problem mal in eine simple Anwendung ausgelagert, damit man es vielleicht besser versteht.
Code der Form: http://pastebin.com/L4TCmh2Q
Code der Klasse: http://pastebin.com/MPStWimf

Ablauf:
Auf der Form erzeuge ich einen BackgroundWorker, der ruft eine Funktion in der Klasse auf. In dieser Klasse habe ich dann ein Parallel.ForEach (nicht über das komische Array wundern, wollte es nur ein wenig näher an mein eigentliches Programm bringen), in diesem ForEach werden mehrere, etwas länger andauernde Berechnungen gestartet. Jetzt hätte ich gerne, dass nach einer erfolgreichen Berechnung (hier Thread.Sleep) die ProgressBar auf der Form eins weiter tickt.

Beim Zugriff bekomme ich aber die Meldung, dass das ein ungültiger threadübergreifender Vorgang ist. Dabei dachte ich eigentlich, dass meine Lösung identisch ist, mit dem was hier beschrieben ist: http://www.codeproject.com/Articles/37474/Threadsafe-Events

Wo stehe ich denn auf dem Schlauch?
03.12.2011
Feroc 1,2k 2 9
1 Antwort
2
Du bringst zwei Themen durcheinander.

Zum einen threadsicheres Programmieren. Dabei geht es um Effekte, die auftreten können, wenn mehrere Threads "parallel" den gleichen Code durchlaufen. Was dabei konkret im Zusammenhang mit Events zu beachten ist, ist Gegenstand des Beitrags bei codeproject.

Zum anderen Threads und (native) UIs. Hier ist es eigentlich unabhängig von der Plattform immer so, dass die Regel gilt, dass nur ein Thread (nicht ein Thread zur selben Zeit, sondern immer nur derselbe eine Thread) das UI manipulieren darf (die sonst notwendige Synchronisation würde das UI sehr träge machen). Gegen diese Regel verstößt Dein Code, und deshalb bekommst Du eine Exception: WorkLongTime.WorkLong() wird nicht im UI-Thread ausgeführt, damit letztlich auch nicht wlt_Changed(), wo Dein UI verändert wird.

Die Lösung: entweder nutzt Du InvokeRequired und Invoke() bzw. BeginInvoke() auf der Form-Klasse, um den notwendigen Thread-Übergang zu vollziehen, oder - meine Empfehlung - Du bedienst Dich des BackgroundWorkers, der dafür schon alles vorbereitet hat. Schau Dir mal die Doku zu ReportProgress() an, da gibt es ein Beispiel, das Dir weiterhelfen sollte.
03.12.2011
Matthias Hlawatsch 13,2k 4 9
Oh man, klar... hatte echt verpennt, dass der BGWorker seine eigene Progress-Funktion hatte.
Feroc 03.12.2011

Stelle deine .net-Frage jetzt!