我有一個程序(在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")));
永遠不要在異步代碼中使用Thread.Sleep,它會破壞整個點。如果由於某種原因需要延遲,請改用Task.Delay()。 –
您收到的錯誤是告訴您,您無法從靜態方法訪問實例成員。靜態意味着該方法在類的所有實例之間共享,但textBox是特定於給定對象的屬性或字段。 –
如果將靜態異步任務ReceiveData()更改爲異步任務ReceiveData(),那麼該錯誤將消失。 –