在Visual C#/ .Net應用程序中,我必須讀取SerialPort,因此我將其分配給DataReceivedEventHandler。替代使用Control.Invoke
但是,我當然不能直接從處理程序中更改UI控件,因爲它們位於單獨的線程中。
該解決方案似乎是使用Control.Invoke,但是,我有太多的UI操作來執行,所以我擔心也許我沒有走正確的道路。
我應該做以下哪一項?
選項A:與調用堅持無論如何,並且執行每個上的每個使用調用爲每個的各種控制的動作。選項B:放置一個50ms重複計時器,其中每50ms檢查一次布爾值是否爲DataReceived == true,如果是,則相應地更新UI控件。 (每次我讀取串行端口DataReceivedEventHandler中的數據時DataReceived設置爲true,否則爲false)。
選項C:任何其他選項?
UPDATE:
成功具有以下(根據@ tcarvin答案,並@Hans帕桑特的評論)。
private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
if (this.InvokeRequired())
{
this.BeginInvoke(new EventHandler<SerialDataReceivedEventArgs>(DataReceivedHandler), new object[] { sender, e });
return;
}
tbSerialStatus.Text = "Received text";
}
只需努力緩衝您收到的數據。經常調用沒有太大意義,你只需要保持人眼快樂。無論如何,做這件事通常都是有問題的,它會導致UI線程獲取太多調用請求並停止繪畫的問題。 –