2017-03-01 3 views
1

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"))); 
+0

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()". –

+0

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. –

+0

Wenn Sie die statische asynchrone Task ReceiveData() in die asynchrone Task ReceiveData() ändern, verschwindet dieser Fehler. –

Antwort

2

Ihr Fehler ist, weil UI-Elemente, wie zum Beispiel eines TextBox, kann nur über den UI-Thread geändert werden.

Um dieses Problem Änderung zu beheben:

textBox.AppendText("Test"); 

zu

Dispatcher.BeginInvoke((Action)(() => textBox.AppendText("Test"))); 

Diese textBox.AppendText("Test"); verursachen wird auf dem UI-Thread ausgeführt werden, sondern dann den Hintergrund-Thread, dass Ihre Aufgabe ausgeführt wird auf.

+0

DANKE SO VIEL!Jetzt ist es woking! Es gibt einen kurzen Weg, dies zu tun? Stellen Sie sich diese lange Struktur in meinem ganzen Code vor :( – Guilherme

+0

Es wird nicht kürzer als das, sorry. –

+0

Kein Problem! Nochmals vielen Dank! @BrandonKramer – Guilherme

Verwandte Themen