【发布时间】:2015-07-09 15:29:35
【问题描述】:
添加前言
在这里我想更好地解释一下我的应用程序的场景。
我需要一个 Windows 服务来将 SerialPort“转换”为 TCPPort。例如,假设我有一个串行票据打印机连接到一个用于原始 ascii 流的 COM 端口,我想通过网络上的 TCP 套接字访问它。结果应该是串口打印机变成了网络打印机,我的服务应该把很多tcp套接字链接到com端口。
这是方案:
主要问题是 COM 端口有一个独特的连接,但在这里我可以同时从网络客户端获得许多连接。我需要同步写入 COMport 并从 COMport 获取输出并将其复制到所有连接的 TCP 客户端。
使用 TCPconnections 我无法知道写入流何时真正关闭,因为网络客户端可以在不关闭其连接的情况下发送打印作业,并在一段时间后发送另一个作业。 串行打印机是内联打印机,没有开始/结束命令,它可以简单地接收 ascii 字符,它们是接收顺序的打印机。 这是因为我需要确保网络输入不会被混合,并且我需要一个能够在释放同步写锁之前能够理解作业真正结束的计时器。
原始问题
我有两个线程:A、B。
两个线程都必须通过 WriteToOutput() 方法写入单个输出缓冲区,并且我想确保如果 A 和 B 都不会混合输出> 想同时写入输出。 首先,我需要一个简单的信号量:
private object locker = new object();
public void WriteToOutput(byte[] threadBuffer)
{
lock (locker)
{
//... copy threadBuffer to outputBuffer
}
}
但我需要更多的安全性来划分输出,因为线程可以清空其缓冲区,但它可以在锁定释放后立即填充。
所以如果线程A获得了锁,那么在并发的情况下,我想等待第二个线程B一段时间,比如说1s的滴答声。如果此时线程 A 想要写更多的东西,它具有优先权,而 B 必须等待另一个滴答声。如果线程A没有写n个完整的tick,那么它真的可以释放锁,B线程可以获得锁。
【问题讨论】:
-
这里的多线程有什么意义?看起来您只需要异步 I/O。你想做什么?
标签: c# multithreading timer semaphore