后台线程中的串行通信

本文关键字:通信 线程 后台 | 更新日期: 2023-09-27 18:21:28

关于arduino板和c#winforms应用程序之间通信的快速问题。基本上,到目前为止我所做的是类似的事情

_serialPort = new SerialPort();
...
_serialPort.Open();
...
_serialPort.DataReceived += OnReceived;
...
private static void OnReceived(object sender, SerialDataReceivedEventArgs c)
{
// Do something
}

只要我把它放在应用程序的主线程中,它就可以工作。我的问题是,是否可以在后台线程中编写一个类,该类与上面的代码(通过串行端口侦听通信)相同。

后台线程中的串行通信

您可能可以,只要SerialPort被实例化,并且所有事件和操作都只发生在后台线程

来自MSDN:

此类型的任何公共静态(在Visual Basic中共享)成员都是线程安全的。任何实例成员都不能保证是线程安全的。

所以这个类不是"线程安全"的,所以尝试以多线程的方式做任何事情都不是一个好主意。

启动一个新线程来执行该代码不是问题。如果使用线程生成的一些数据来更新应用程序的UI,则可能会出现此问题。请参阅SO上的其他问题:如何从C#中的另一个线程更新GUI?

我认为它不起作用,因为在OnReceived方法中,您正试图将某些内容写入GUI控件(例如TextBox)。

这是失败的部分,而不是数据本身的接收。如果你想在这个方法中访问GUI线程,你应该在所需的控件上调用[Invoke()][1]BeginInvoke(),并将你的代码放在给定的lambda.中

对于更高级的东西,您还可以考虑使用ReactiveExtensions和ObserveOn()方法。

我有一个答案:

public delegate void DisplayInfoSentDelegate(byte[] abyBuf);
private void SendThread(_dlg pThis, byte[] abyBuf, int iNumOfBytes)
{
  ...
  pThis.Invoke(new DisplayInfoSentDelegate(DisplayInListBox), new object[] { abyBuf});
}