Sie können nicht die meisten Steuereigenschaften von einem anderen Thread als dem Thread ändern in dem das Steuerelement erstellt wurde.
Prüfen, ob invoke erforderlich ist, das heißt, der aktuelle Code auf einem anderen Thread als der Thread ausgeführt wird, in dem die Steuerung (TextBox Test) erstellt wurde. Wenn test.InvokeRequired
wahr ist, dann sollten Sie den Anruf aufrufen.
Private Sub ...
Dim powershellWorker As New BackgroundWorker
AddHandler powershellWorker.DoWork, AddressOf BackgroundWorker1_DoWork
powershellWorker.RunWorkerAsync()
End Sub
Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
If stuff <> "lol" Then
If test.InvokeRequired Then
test.Invoke(Sub() test.Text = stuff)
Else
test.Text = stuff
End If
End If
End Sub
können Sie automatisieren die invoke erforderliche Muster mit dieser Erweiterung Methode:
<Extension()>
Public Sub InvokeIfRequired(ByVal control As Control, action As MethodInvoker)
If control.InvokeRequired Then
control.Invoke(action)
Else
action()
End If
End Sub
Dann könnten Sie den Code zu vereinfachen:
kann nur auf dem Thread aktualisiert werden
Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
If stuff <> "lol" Then
test.InvokeIfRequired(Sub() test.Text = stuff)
End If
End Sub
UI-Komponenten, die erstellt sie. Verwenden Sie die Methode '.Invoke()' des Textfelds, um dies über einen Hintergrundthread zu tun. –
Mögliches Duplikat von [VB.net-Einstellungswerten zu Beschriftungen in einem Hintergrundarbeiter] (http://stackoverflow.com/questions/18844490/vb-net-setting-values-to-labels-inside-a-backgroundworker) – topshot