2017-03-01 22 views
1

我有一個程序(在WPF應用程序中)通過COM端口的線程信息接收。 這裏有一部分來自:發生在WPF中的線程(TASK)中寫入文本框

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"); 
      }   
    } 

的問題,因爲它可以在文本框中就在這個任務被寫。 我有很多其他的textBox外面,工作得很好。 誰出現的錯誤是:需要

的對象引用的非靜態字段,方法或 財產「MainWindow.textBox」

如果我更改任務公衆錯誤消失,但是當我構建程序時,文本不會出現在框中。

我知道這是關於參考的消息,但它似乎這部分是好的,我認爲這是關於把文本框在公共訪問。

我只更改了代碼:

async Task ReceiveData(SerialPort port) 

,並對輸出的出現以下錯誤:

拋出異常: 'System.InvalidOperationException' 在WindowsBase.dll

錯誤是:「」調用線程不能訪問這個對象,因爲不同的線程擁有它。「」

----------解決的@BrandonKramer ---------- 使用:

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

永遠不要在異步代碼中使用Thread.Sleep,它會破壞整個點。如果由於某種原因需要延遲,請改用Task.Delay()。 –

+0

您收到的錯誤是告訴您,您無法從靜態方法訪問實例成員。靜態意味着該方法在類的所有實例之間共享,但textBox是特定於給定對象的屬性或字段。 –

+0

如果將靜態異步任務ReceiveData()更改爲異步任務ReceiveData(),那麼該錯誤將消失。 –

回答

2

你的錯誤是因爲UI元素,如TextBox,可以只能從UI線程修改。

爲了解決這個問題,更改:

textBox.AppendText("Test"); 

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

這將導致textBox.AppendText("Test");要在UI線程上執行,而不是後臺線程,您的任務是執行上。

+0

非常感謝!現在是在開玩笑!有一個簡短的方法來做到這一點?想象一下,在我所有的代碼中這個長結構:( – Guilherme

+0

它沒有得到任何短於此,對不起。 –

+0

沒問題!再次謝謝!@BrandonKramer – Guilherme