【问题标题】:How to implement SerialPort with thread/background worker C#?如何使用线程/后台工作者 C# 实现 SerialPort?
【发布时间】:2010-08-06 15:46:48
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: c# multithreading serial-port


    【解决方案1】:

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

    您还可以查看新的任务库。

    开始调查,如果您还有其他问题,请回来查看 =)

    同样来自带有线程的 msdn 库串行端口 example 这是控制台,但无论如何。

    【讨论】:

    • 我在 msdn 网站上做了一些进一步的调查,我读到 DataReceieved 事件是在一个单独的线程上创建的。那么这是否意味着在该事件处理程序中处理的内容已经在一个单独的线程上?那么我想做的事情是多余的吗?
    • 嗯,是的,我猜它是... =) 只需确保您使用 BackgroundWorker 或类似的 UI,这样您就不会“挂起” UI,这就是您需要使用的地方穿线。因此,串行端口的整个处理都在一个线程中,您可以在其中使用事件。
    【解决方案2】:

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

    类似:

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

    【讨论】:

      【解决方案3】:

      只需使用DataReceived 事件。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-05
        • 1970-01-01
        • 1970-01-01
        • 2014-03-10
        相关资源
        最近更新 更多