2010-08-06 90 views
1

我在写一个能够处理与外部设备(即读写)的所有串行通信的类。数据以20Hz传输到计算机,偶尔也会将数据写入设备。然后,该类将通过事件将有效数据输出到主UI。 我想把这个类放在一个单独的线程中,因为我之前的代码在设备中导致了一些'口吃',因为它在主UI线程中。如何使用线程/后台工作者C#实现SerialPort?

我只是不确定如何使用线程/后台工作器来构造和实现SerialPort类,因为我在这方面没有经验。

只有数据接收事件存在于线程/后台工作者内部吗? 如何将数据传入和传出创建的线程/后台工作者?

任何提示或建议将不胜感激!

回答

1

我的第一个技巧是,你应该把它想它是网络(插座)通信。线程问题大致相同。通过他们所拥有的MSDN文档(如果我没有记错的话)通过两种不同的方式进行异步和同步。我个人会使用其中一种异步方式。

你也可以看看新的任务库。

开始寻找到该回来,如果你还有其他问题,=)

从MSDN库串口

还与线程example这是安慰,但无论如何。

+0

我做了一些关于msdn网站的进一步调查,并且我读到DataReceieved事件是在单独的线程上创建的。那么这是否意味着事件处理程序中处理的内容已经在单独的线程中?那么我试图做多余? – steeppham 2010-08-08 07:37:28

+0

嗯,是的,我想这是... =)只要确保你使用BackgroundWorker或类似的东西的UI,所以你不要“挂”用户界面,这是你需要使用线程的地方。所以整个串行端口的处理都在一个线程中,在你使用的事件中。 – 2010-08-11 09:40:39

0

您只是在另一个线程中实现SerialPort的实际使用。当需要“通知”你的UI的时候,你可以使用“BeginInvoke”来获得在UI线程中运行的实际的UI处理。

喜欢的东西:

string s = _port.ReadLine(); 

form.BeginInvoke((MethodInvoker)delegate 
{ 
    _textbox.Text = s; 
}); 
0

只需使用DataReceived事件。