Hallo Zusammen
Ich bin gerade etwas ratlos bezüglich eines Multi-Threading Problems. Ich starte meinen Arbeitsprozess in einem separatem Thread, wobei ich von diesem auf Form-Steuerelemente meines initialen Threads zugreifen will. Habe mich darüber schlau gemacht und eine entsprechende Lösung mittels InvokeRequired usw. entwickelt.
Mein Code sieht wie folgt aus:
Thread erstellen und starten
Durch Thread aufgerufener Sub
Module ThreadInvokeHelper wird aufgerufen, um den Label Text sicher zu verändern
Das Modul, welches mittels übergebener Form und Control Element den Text im Label anpassen soll
Mein Problem ist nun, dass ich trotz (aus meiner Sicht) Threadsicherer Abhandlung nach Microsoft Seite (Link) den folgenden Fehler bekomme:
Hat jemand eine Idee an was das liegen könnte?
Vielen Dank für eure Hilfe.
Ich bin gerade etwas ratlos bezüglich eines Multi-Threading Problems. Ich starte meinen Arbeitsprozess in einem separatem Thread, wobei ich von diesem auf Form-Steuerelemente meines initialen Threads zugreifen will. Habe mich darüber schlau gemacht und eine entsprechende Lösung mittels InvokeRequired usw. entwickelt.
Mein Code sieht wie folgt aus:
Thread erstellen und starten
Quellcode
- Public Class Start
- Private WithEvents backgroundWorker1 As BackgroundWorker
- Private Sub formLoad(sender As Object, e As EventArgs) Handles Me.Load
- End Sub
- Private Sub btnStartFromBeginning_Click(sender As Object, e As EventArgs) Handles btnStartFromBeginning.Click
- Dim migrationThread As System.Threading.Thread
- migrationThread = New System.Threading.Thread(AddressOf MigrationController.startMigration)
- Debug.Print("Starting Migration...")
- migrationThread.Start() 'Vorgang starten
- End Sub
- End Class
Durch Thread aufgerufener Sub
Module ThreadInvokeHelper wird aufgerufen, um den Label Text sicher zu verändern
Quellcode
- Module CreateConnection
- Sub connectServices()
- '### Connect SmarTeam
- connectSmarTeam()
- End Sub
- Private Sub connectSmarTeam()
- Dim sSmarTeamState As String = Functions.connectToSmarTeam()
- If sSmarTeamState.Contains("Error") Then
- ThreadInvokeHelper.setText(Start, Start.lblStateSmarTeam, "† SmarTeam: " & sSmarTeamState)
- Else
- ThreadInvokeHelper.setText(Start, Start.lblStateSmarTeam, "✓ SmarTeam: " & sSmarTeamState)
- End If
- End Sub
- End Module
Das Modul, welches mittels übergebener Form und Control Element den Text im Label anpassen soll
Quellcode
- Module ThreadInvokeHelper
- Delegate Sub setTextCallback(ByVal form As Form, ByVal ctrl As Control, ByVal sText As String)
- Public Sub setText(ByVal form As Form, ByVal ctrl As Control, ByVal sText As String)
- If ctrl.InvokeRequired Then
- 'If Invoke Requred --> Make Callback
- Dim callback As New setTextCallback(AddressOf setText)
- form.Invoke(callback, New Object() {form, ctrl, sText})
- Else
- 'Set Text directly
- ctrl.Text = sText
- End If
- End Sub
- End Module
Mein Problem ist nun, dass ich trotz (aus meiner Sicht) Threadsicherer Abhandlung nach Microsoft Seite (Link) den folgenden Fehler bekomme:
An unhandled exception of type 'System.InvalidOperationException' occurred in AstrolabMigration.exe
Additional information: Fehler beim Erstellen des Formulars. Weitere Informationen finden Sie in Exception.InnerException. Fehler: Ungültiger threadübergreifender Vorgang: Der Zugriff auf das Steuerelement erfolgte von einem anderen Thread als dem Thread, für den es erstellt wurde..
Hat jemand eine Idee an was das liegen könnte?
Vielen Dank für eure Hilfe.
Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „vb123“ ()