Zum Gruße allerseits,
da ich meine Probleme hatte eine Statusaktualisierung des mit Hilfe eines BackgroundWorker im Hintergrund laufenden Prozesses auf der GUI meiner Windows Forms-Anwendung auszugeben, habe ich mir eine Anwendung erstellt, die diesem Problem auf die Schliche kommen sollte.
Zunächst einmal das funktionierende Beispiel:
Meine "ausführende" Prozedur StartTest(), die ReportProgress aufruft, befindet sich mit der Klasse der Form.
So funktioniert alles, die ausgegebenen ThreadIDs sind wie erwartet:
Wenn jetzt aber die Funktion StartTest() auslagern möchte in ein Modul (Ich möchte die Form-Klasse möglichst frei von den eigentlichen "Berechnungen" halten) wird das ProgressChanged-Event plötzlich im Thread des BackGroundWorkers ausgelöst. Und damit wird auch das Label nicht aktualisiert.
Mir ist nicht klar, ob das so beabsichtigt ist, und wenn ja warum.
Natürlich könnte ich mein Programm so ummodeln, dass ich alles in die Klasse der Form setze, aber prinzipiell widerstrebt mir das und ich möchte es natürlich verstehen.
da ich meine Probleme hatte eine Statusaktualisierung des mit Hilfe eines BackgroundWorker im Hintergrund laufenden Prozesses auf der GUI meiner Windows Forms-Anwendung auszugeben, habe ich mir eine Anwendung erstellt, die diesem Problem auf die Schliche kommen sollte.
Zunächst einmal das funktionierende Beispiel:
VB.NET-Quellcode
- Public Class Form1
- Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
- Debug.Print("form 1 - dowork : " & CStr(Threading.Thread.CurrentThread.ManagedThreadId))
- StartTest() End Sub
- Private Sub BackgroundWorker1_ProgressChanged(ByVal sender As System.Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
- Debug.Print("form 1 - progress : " & CStr(Threading.Thread.CurrentThread.ManagedThreadId))
- Label1.Text = e.ProgressPercentage
- End Sub
- Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As System.Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
- Debug.Print("form 1 - completed : " & CStr(Threading.Thread.CurrentThread.ManagedThreadId))
- Label1.Text = "fertig"
- End Sub
- Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
- Debug.Print("form 1 - startclick : " & CStr(Threading.Thread.CurrentThread.ManagedThreadId))
- BackgroundWorker1.RunWorkerAsync()
- End Sub
- Private Sub StartTest()
- Debug.Print("form 1 - starttest : " & CStr(Threading.Thread.CurrentThread.ManagedThreadId))
- For i As Integer = 1 To 5
- BackgroundWorker1.ReportProgress(i * 20)
- Threading.Thread.Sleep(250)
- Next
- End Sub
- End Class
Meine "ausführende" Prozedur StartTest(), die ReportProgress aufruft, befindet sich mit der Klasse der Form.
So funktioniert alles, die ausgegebenen ThreadIDs sind wie erwartet:
Wenn jetzt aber die Funktion StartTest() auslagern möchte in ein Modul (Ich möchte die Form-Klasse möglichst frei von den eigentlichen "Berechnungen" halten) wird das ProgressChanged-Event plötzlich im Thread des BackGroundWorkers ausgelöst. Und damit wird auch das Label nicht aktualisiert.
Mir ist nicht klar, ob das so beabsichtigt ist, und wenn ja warum.
Natürlich könnte ich mein Programm so ummodeln, dass ich alles in die Klasse der Form setze, aber prinzipiell widerstrebt mir das und ich möchte es natürlich verstehen.
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „isturiel“ ()