2016-07-06 8 views
1

Ich möchte nur einen Textbox Text ändern, während ich in der Background bin. Was ich habe, ist:Wie während in Background ändern TextBox.Text?

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 
      test.Text = stuff 

End Sub 

Es mir den Fehler gibt: „Invalid Thread -border Betrieb“ (Google übersetzt) ​​

+2

UI-Komponenten, die erstellt sie. Verwenden Sie die Methode '.Invoke()' des Textfelds, um dies über einen Hintergrundthread zu tun. –

+2

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

Antwort

2

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 
+0

Versuchte alle - und es funktioniert einfach schön! thx viel Typ! Nun, ein wenig mehr Frage: Wie starte ich einen Timer im Hintergrund? "Timer2.Invoke (Sub() Timer2.Start())" leider nicht funktioniert. – hannir

+0

Gefunden eine Lösung für die Timer-Start :) "timerclick.Invoke (Sub() timerclick.PerformClick())" einfach eine Schaltfläche klicken, die den Timer für Sie beginnt. – hannir