C# DataReceived事件的跨線程通信

c#
小樊
93
2024-08-08 21:05:41
欄目: 編程語言

在C#中,可以通過使用委托和事件來實(shí)現(xiàn)跨線程通信。具體來說,可以在主線程中訂閱DataReceived事件,并在事件處理程序中使用Invoke方法將事件委托到UI線程上執(zhí)行。這樣可以確保在事件處理程序中更新UI控件而不會(huì)引發(fā)線程訪問異常。

下面是一個(gè)示例代碼,演示了如何在C#中實(shí)現(xiàn)DataReceived事件的跨線程通信:

using System;
using System.IO.Ports;
using System.Windows.Forms;

public class SerialPortManager
{
    private SerialPort serialPort;

    public SerialPortManager(string portName)
    {
        serialPort = new SerialPort(portName);
        serialPort.DataReceived += SerialPortDataReceived;
    }

    public void Open()
    {
        serialPort.Open();
    }

    public void Close()
    {
        serialPort.Close();
    }

    private void SerialPortDataReceived(object sender, SerialDataReceivedEventArgs e)
    {
        string data = serialPort.ReadExisting();

        // 使用Invoke方法將事件委托到UI線程上執(zhí)行
        Form1 form = Application.OpenForms[0] as Form1;
        form.Invoke(new Action(() =>
        {
            // 在UI線程上更新UI控件
            form.textBox1.Text = data;
        }));
    }
}

public class Form1 : Form
{
    private SerialPortManager serialPortManager;

    public Form1()
    {
        serialPortManager = new SerialPortManager("COM1");
        serialPortManager.Open();
    }
}

在上面的示例中,SerialPortManager類用于管理串口通信,并在DataReceived事件中更新UI控件。在Form1類的構(gòu)造函數(shù)中,訂閱了DataReceived事件,并在事件處理程序中使用Invoke方法將更新UI控件的操作委托到UI線程上執(zhí)行。

通過這種方式,可以確保在串口通信中更新UI控件時(shí)不會(huì)引發(fā)線程訪問異常,實(shí)現(xiàn)了跨線程通信。

0