如何从主(UI)线程上的另一个线程引发事件?

时间:2019-05-22 10:32:20

标签: c# .net winforms

我正在尝试从主线程的SerialPort.DataReceived事件中的工作线程引发事件。

背景:我连接的设备可以自行将数据发送到PC的串行端口。我需要识别此数据,并在完成电报后将其传递给UI线程,例如显示收到的值。因为数据可以自发到达,所以我使用了SerialPort类的DataReceived事件。

DataReceived事件创建了自己的后台线程,这我知道,这是我的问题。电报完成后,我会在应用程序的打开表单上引发一个事件,例如更新某个文本字段。问题是,此事件引发是在SerialPort接收到的事件的工作线程中完成的。

是否可以在主UI线程上引发此事件?

1 个答案:

答案 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。