C# 新线程上的SerialPort缓冲区

C# 新线程上的SerialPort缓冲区,c#,multithreading,C#,Multithreading,我有一个从FormGUI访问的MySerialPort类/对象。创建MySerialPort对象后,我想打开它,并持续接收数据。数据将在对象的数据缓冲区中存储和管理。FormGUI的memoEdit将显示从MySerialPort对象的缓冲区接收到的代码 如何将新线程与[port].ReadExisting方法一起使用 using System; using System.IO.Ports; using System.Threading; class MySerialPort { pub

我有一个从FormGUI访问的MySerialPort类/对象。创建MySerialPort对象后,我想打开它,并持续接收数据。数据将在对象的数据缓冲区中存储和管理。FormGUI的memoEdit将显示从MySerialPort对象的缓冲区接收到的代码

如何将新线程与[port].ReadExisting方法一起使用

using System;
using System.IO.Ports;
using System.Threading;

class MySerialPort
{
   public SerialPort CreatePort(string portName, int portSpeed, int portParity, int portDataSize, int portStopBits)
   {
      // fixed values while testing
      var port = new SerialPort("COM6", 9600, Parity.None, 8, StopBits.One);
      return port;
   }

   public void OpenPort(SerialPort port)
   {
      port.Open();
      new Thread(() => port.ReadExisting).Start();
      while (true)
      {
         // Send to buffer
         // Maybe some break condition
      }
}

Observer模式现在正在工作,我从串行端口获得了预期的数据,谢谢Henk

public partial class MyGUI : Form
{
    private MySerialPort MyPort = new MySerialPort();

    public MyGUI()
    {
        InitializeComponent();
        MyPort.OnDataBufferUpdate += DisplayNewData;
    }

    public void DisplayNewData(object sender, EventArgs e)
    {
        if (this.InvokeRequired)
        {
            BeginInvoke(new MethodInvoker(delegate() { DisplayNewData(sender, e); }));
        }
        else
        {
            memoEdit.Text = MyPort.DataBuffer;
        }
    }
}

public class MySerialPort
{
    public MySerialPort()
    {
        // Initialize serial port
        _Port.DataReceived += _Port_DataReceived;
    }

    public delegate void HandleDataBufferUpdate(object sender, EventArgs e);
    public event HandleDataBufferUpdate OnDataBufferUpdate = delegate {};

    private void _Port_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {
        // Set _Port.DataBuffer from serial port buffer, then activate event below to signal form
        OnDataBufferUpdate(this, EventArgs.Empty);
    }
}

首先,想想你们班应该做什么。serialport类不应尝试对UI执行反线程处理。已使用我到目前为止的更新代码。当激活_Port_DataReceived事件时,将读取串行端口缓冲区,并根据当前所需的数据类型,将数据字符串存储在_DataBuffer中,当在_Port_DataReceived事件结束时调用OnDataBufferUpdate事件时,该字符串以公共DataBuffer的形式被调用,添加_Port+=_Port\u DataReceived;。DisplayNewData需要处理调用所需的逻辑。帮自己一个大忙,在XxEventArgs中传递一份数据副本。是的,捕获到缺少的事件处理程序声明:_Port.DataReceived+=_Port_DataReceived;,然后得到著名的跨线程操作无效:控件“memoEdit”是从创建它的线程以外的线程访问的。错误,这与您提到的invokererequired逻辑有关。谢谢,我看到了一些进展。我注意到OnDataBufferUpdate事件是在私有事件处理程序中触发的,没有任何后果,因为该事件被声明为公共事件。