后台线程中的串行通信

时间:2012-01-26 21:07:04

标签: c# multithreading arduino

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

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

只要我把它放在应用程序的主线程中,这就可以工作。我的问题是,是否可以编写一个类,它与上面的代码(通过serialport监听通信)在后台线程中一样。

4 个答案:

答案 0 :(得分:4)

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

来自MSDN:

  

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

所以这个类不是“线程安全”,因此尝试以多线程方式执行任何操作都不是一个好主意。

答案 1 :(得分:3)

启动新线程来执行该代码不是问题。如果您使用线程生成的某些数据来更新应用程序的UI,则可能会出现此问题。请参阅另一个关于SO的问题:How to update the GUI from another thread in C#?

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:1)

我有一个答案:

public delegate void DisplayInfoSentDelegate(byte[] abyBuf);

private void SendThread(_dlg pThis, byte[] abyBuf, int iNumOfBytes)
{
  ...
  pThis.Invoke(new DisplayInfoSentDelegate(DisplayInListBox), new object[] { abyBuf});
}
相关问题