Ich habe ein Programm (In WPF-Anwendung), die durch einen Thread Informationen vom COM-Anschluss erhalten. Hier ist ein Teil davon:Schreiben auf Textbox in einem Thread (TASK) in WPF-Anwendung
static async Task ReceiveData(SerialPort port)
{
try
{
Thread.Sleep(50); // Time for read works
await port.BaseStream.ReadAsync(buffer, 0, 55); //Wait recive data from Serial Port
textBox.AppendText("Test");
}
}
Das Problem tritt auf, weil es gerade bei dieser Aufgabe im Textfeld schreiben werden kann. Ich habe viele andere textBox draußen und funktioniert gut. Der Fehler, die zeigen, ist:
Eine Objektreferenz für das nicht-statische Feld, Methode erforderlich ist, oder Eigenschaft ‚MainWindow.textBox‘
Wenn ich die Aufgabe ändern Öffentlichkeit für die Fehler verschwindet, aber wenn ich das Programm erstelle, erscheint der Text nicht auf der Box.
Ich kenne die Nachricht, es handelt sich um Referenz, aber es scheint, dass dieser Teil OK ist, ich denke, es ist etwas über die TextBox in den öffentlichen Zugriff.
ich ändern Sie den Code nur für:
async Task ReceiveData(SerialPort port)
Und die folgenden Fehler angezeigt auf Ausgang:
Ausnahme geworfen: 'System.InvalidOperationException' in WindowsBase.dll
Und der Fehler ist: "" Der aufrufende Thread kann nicht auf dieses Objekt zugreifen, da ein anderer Thread es besitzt. ""
---------- VON @BrandonKramer GELöST ---------- Verwendung:
Dispatcher.BeginInvoke((Action)(() => textBox.AppendText("Test")));
Verwenden Sie niemals Thread.Sleep im asynchronen Code, es besiegt den ganzen Punkt. Wenn Sie aus irgendeinem Grund verzögern müssen, verwenden Sie stattdessen "aware Task.Delay()". –
Der Fehler, den Sie bekommen, sagt Ihnen, dass Sie nicht auf Instanzmember von einer statischen Methode zugreifen können. Statisch bedeutet, dass die Methode für alle Instanzen der Klasse freigegeben ist, aber textBox ist eine Eigenschaft oder ein Feld, das für ein bestimmtes Objekt spezifisch ist. –
Wenn Sie die statische asynchrone Task ReceiveData() in die asynchrone Task ReceiveData() ändern, verschwindet dieser Fehler. –