Beim Zugriff: Ich versuche, dies zu tun in der Klasse
Richtextbox1.AppendText("Console is currently ON.")
, aber es wird nicht funktionieren, tun einfach
Vom Form1.vb kann ich Steuerelemente aus einem anderen Thread müssen Sie normalerweise das Zugreifen/Aktualisieren des Steuerelements aufrufen. Dies geschieht, um die Aktualisierung der Steuerelemente zu synchronisieren, sodass zwei Threads nicht gleichzeitig ein Steuerelement aktualisieren.
Sie können es sich so vorstellen: Zwei Personen können nicht gleichzeitig auf demselben Papier schreiben.
Aufruf ist in der Regel nichts schweres. Es ist im Grunde nur diese beiden Dinge tun:
- Überprüfen Sie, ob Aufruf durch das Steuerelement oder seinen Container erforderlich ist.
- Bei Bedarf aufrufen.
Aufruf wird mithilfe von Delegate-Methoden ausgeführt. Wenn Sie auf .NET Framework 4.0 oder höher abzielen, können Sie den Lambda-Ausdruck Sub()
verwenden, um einen sehr einfachen Delegaten zu erstellen.
Public Sub FZConsole()
While True
If Form1.InvokeRequired = True Then 'Invocation is required.'
Form1.Invoke(Sub() Form1.Richtextbox1.AppendText(Environment.NewLine & "Test From Class"))
Else 'Invocation is not required.'
Form1.Richtextbox1.AppendText(Environment.NewLine & "Test From Class")
End If
Threading.Thread.Sleep(1)
End While
End Sub
Allerdings, wenn Sie .NET Framework Ziel von 3,5 oder darunter Dinge werden ein wenig komplizierter. Wenn Sie auf ein älteres Framework abzielen, müssen Sie den Delegaten selbst deklarieren, und das ist nicht so einfach wie das Verwenden des Lambda, da es beim Übergeben von Variablen anders funktioniert.
Delegate Sub TextUpdaterDelegate(ByVal Text As String)
Public Sub FZConsole()
While True
If Form1.InvokeRequired = True Then 'Invocation is required.'
Form1.Invoke(New TextUpdaterDelegate(AddressOf RichTextBox1.AppendText), Environment.NewLine & "Test From Class")
Else 'Invocation is not required.'
Form1.Richtextbox1.AppendText(Environment.NewLine & "Test From Class")
End If
Threading.Thread.Sleep(1)
End While
End Sub
Wo rufst du das Sub 'FZConsole' an? –
Ich rufe es mit einem Thread an. 'Dim thread_fzconsole As System.Threading.Thread = Neues System.Threading.Thread (AddressOf FZConsole.FZConsole)' – Randomizers
Sie sollten die Form- oder RichTextBox-Instanz an Ihren Thread übergeben, bevor Sie es starten. ** SIE MÜSSEN AUCH ** die Aktualisierung der RTB aufrufen, da sonst eine CrossThreadOperation-Ausnahme auftritt. –