【问题标题】:C# TCP/IP Client that sends data received from serial port - Suggestions发送从串行端口接收到的数据的 C# TCP/IP 客户端 - 建议
【发布时间】:2013-10-02 14:22:21
【问题描述】:

目前我正在开发一个应用程序,该应用程序通过串行端口从 RFID 读卡器接收数据。数据,然后数据应该通过 TCP/IP 发送到服务器。

我已经让这两个东西都工作了,但不是同时工作。我可以从卡上读取 ID,也可以向服务器发送一些文本。但我想请教您的建议,这两个东西协同工作的最佳解决方案是什么。

目前我在两个类中有 TCP/IP 使用和串行使用。从主类创建两个类的对象并启动一个从串行端口读取数据的线程。

我应该尝试这样的事情吗?

在类中,我将只创建串行使用对象并调用处理读取的线程。在该读取线程内部,我将调用一个新线程,该线程将打开 TCP/IP 连接并发送从串行端口接收到的数据。

另一种类似的方法会从主类打开两个连接,但它会从串行端口接收线程启动 TCP/IP 发送线程(通过已经打开的连接)。

我在线程方面没有太多经验,所以这就是我向软件开发人员寻求帮助的原因。谢谢! (如果有帮助,我可以在此处粘贴部分代码)。

更新:

这就是提示,我会仔细研究您的建议。我想这是个好主意,但正如我所说,我在线程方面没有太多经验。如果我在这些类中创建单独的线程,并且它们都将使用相同的对象,比如说消息类的对象,我将在 COM 处理线程中创建新对象,并且 TCP/IP 处理线程将使用该对象,它会起作用吗?通过 TCP/IP 从它发送数据?我可以像使用 List 一样制作 Message 类的对象队列吗?另外,我如何将在类中的一个线程中创建的对象队列传递给另一个线程

【问题讨论】:

  • 查看我的博客文章 Simple multithreading, part 2 以获取使用 BlockingCollection 的示例。示例读取和写入文件,但概念相同:输入线程读取文件并将数据排队。输出线程读取消息队列并写入输出文件。该示例有两个队列,因为中间有一个处理步骤,但您可以消除处理步骤并使用单个队列。

标签: c# multithreading sockets tcp serial-port


【解决方案1】:

将两种不同的通信方法抽象到单独的类中是很好的设计,所以我会坚持下去。

不是在主类中处理线程,而是让每个通信类处理自己的线程管理,并通过共享的threadsafe queue 在它们之间进行通信。

然后,您的串行通信对象可以处理与串行端口的通信、读取数据并将该数据放入队列中。 TCP comms 对象可以处理连接、重新连接、断开连接等...并使用队列中的数据并将其发送到套接字并在网络上发送出去。

您的主类可以只创建队列和传递同一个队列实例的两个通信对象。

【讨论】:

  • 这是小费,我会仔细研究您的建议。我想这是个好主意,但正如我所说,我在线程方面没有太多经验。如果我在这些类中创建单独的线程,并且它们都将使用相同的对象,比如说消息类的对象,我将在 COM 处理线程中创建新对象,并且 TCP/IP 处理线程将使用该对象,它会起作用吗通过 TCP/IP 从它发送数据?我可以像使用 List 一样制作 Message 类的对象队列吗?另外,我如何将在类中的一个线程中创建的对象队列传递给另一个线程
  • 好建议,但我建议BlockingCollection<T> 而不是ConcurrentCollection&lt;T&gt;BlockingCollection 有一个更好的 API,可以处理取消和非忙等待等。默认情况下,它使用 ConcurrentQueue 作为其后备存储,因此您仍然可以获得 FIFO 行为。
  • @Lichoniespi 是的,集合是模板化的 (),因此您可以创建 BlockingCollection。不要在线程中实例化它,在主类中实例化它并将其传递给 Serial 和 Network 处理类(可能通过构造函数?),然后它们将使用相同的实例。
  • 伟大的提示理查德。这正是我要做的。如果我有任何问题,我会告诉你们。 brb 编码...
  • 嗯,它有效。或多或少。我可以在一个线程中向我的 BlockingCollection 添加一个对象,并在另一个线程中读取它。但我也想在它完成工作后删除该对象。会有很多对象,它必须像生产者每隔几秒获取一个新对象一样工作 -> 消费者每隔几秒读取一次对象并通过 TCP/IP 发送它,如果确认对象已成功发送,我会撒谎从 BlockingCollection 中删除该对象。
猜你喜欢
  • 2022-06-29
  • 2012-10-17
  • 2018-09-19
  • 1970-01-01
  • 2012-05-21
  • 1970-01-01
  • 1970-01-01
  • 2020-01-29
  • 2012-03-05
相关资源
最近更新 更多