关于arduino板和c#winforms应用程序之间通信的快速问题。基本上我到目前为止所做的就是
_serialPort = new SerialPort();
...
_serialPort.Open();
...
_serialPort.DataReceived += OnReceived;
...
private static void OnReceived(object sender, SerialDataReceivedEventArgs c)
{
// Do something
}
只要我把它放在应用程序的主线程中,这就可以工作。我的问题是,是否可以编写一个类,它与上面的代码(通过serialport监听通信)在后台线程中一样。
答案 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});
}