我正在尝试从主线程的SerialPort.DataReceived事件中的工作线程引发事件。
背景:我连接的设备可以自行将数据发送到PC的串行端口。我需要识别此数据,并在完成电报后将其传递给UI线程,例如显示收到的值。因为数据可以自发到达,所以我使用了SerialPort类的DataReceived事件。
DataReceived事件创建了自己的后台线程,这我知道,这是我的问题。电报完成后,我会在应用程序的打开表单上引发一个事件,例如更新某个文本字段。问题是,此事件引发是在SerialPort接收到的事件的工作线程中完成的。
是否可以在主UI线程上引发此事件?
答案 0 :(得分:0)
通过执行以下操作,我可以实现类似的目的:
在MainWindow类中,添加以下内容:
internal static MainWindow _MainWindow;
internal string SerialData
{
get => SerialDataTextBox.Content.ToString();
set { this.Dispatcher.Invoke((() => { SerialDataTextBox.Content = value; })); }
}
在包含我的事件处理程序/更新方法的类中,添加以下内容:
private string _convertedSerialData;
public string ConvertedSerialData
{
get => _convertedSerialData;
set
{
_convertedSerialData = value;
MainWindow._MainWindow.SerialData= value == null ? "" : value;
}
}
然后,在事件处理程序内部,更新ConvertedSerialData字段,然后将其传播到您的UI。