如何使用线程/后台工作线程C#实现SerialPort?

如何使用线程/后台工作线程C#实现SerialPort?,c#,multithreading,serial-port,C#,Multithreading,Serial Port,我正在编写一个类,它将处理与外部设备的所有串行通信(即读写)。数据以20Hz的频率传输到计算机,偶尔数据也会写入设备。然后,该类将通过事件向主UI输出有效数据。 我想把这个类放在一个单独的线程中,因为我以前的代码在设备中造成了一些“口吃”,因为它在主UI线程中 我只是不确定如何用线程/后台工作者构造和实现SerialPort类,因为我在这方面缺乏经验 线程/后台工作线程中是否只存在接收到的数据事件? 如何将数据传入和传出创建的线程/后台工作线程 任何提示或建议将不胜感激 您只需在另一个线程中实现

我正在编写一个类,它将处理与外部设备的所有串行通信(即读写)。数据以20Hz的频率传输到计算机,偶尔数据也会写入设备。然后,该类将通过事件向主UI输出有效数据。 我想把这个类放在一个单独的线程中,因为我以前的代码在设备中造成了一些“口吃”,因为它在主UI线程中

我只是不确定如何用线程/后台工作者构造和实现SerialPort类,因为我在这方面缺乏经验

线程/后台工作线程中是否只存在接收到的数据事件? 如何将数据传入和传出创建的线程/后台工作线程


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

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

比如:

string s = _port.ReadLine();

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

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

比如:

string s = _port.ReadLine();

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

我的第一个建议是,你应该把它看作是网络(套接字)通信。线程问题大致相同。查看MSDN文档,他们有两种不同的方法(如果我没记错的话),异步和同步。我个人会使用其中一种异步方式

您还可以查看新的任务库

开始关注这一点,如果您还有其他问题,请回来=)


也可以从msdn库串行端口通过线程连接到控制台,但无论如何。

我的第一个技巧是,您应该将其视为网络(套接字)通信。线程问题大致相同。查看MSDN文档,他们有两种不同的方法(如果我没记错的话),异步和同步。我个人会使用其中一种异步方式

您还可以查看新的任务库

开始关注这一点,如果您还有其他问题,请回来=)


也可以从msdn库串行端口通过线程连接到控制台,但无论如何。

只需使用
DataReceived
事件。

只需使用
DataReceived
事件。

我在msdn站点上做了一些进一步的调查,我了解到DataReceived事件是在单独的线程上创建的。那么这是否意味着事件处理程序中处理的内容已经在一个单独的线程中?那么我想做的是多余的吗?是的,我想是…=)只需确保在UI中使用BackgroundWorker或类似的工具,这样就不会“挂起”UI,而这正是您需要使用线程的地方。因此,串行端口的整个处理都在一个线程中,在这个线程中,您可以使用事件。我在msdn站点上做了一些进一步的调查,我了解到DataReceived事件是在一个单独的线程上创建的。那么这是否意味着事件处理程序中处理的内容已经在一个单独的线程中?那么我想做的是多余的吗?是的,我想是…=)只需确保在UI中使用BackgroundWorker或类似的工具,这样就不会“挂起”UI,而这正是您需要使用线程的地方。因此,串行端口的整个处理都在一个线程中,在这个线程中,您使用事件。