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
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.