我想要的是什么:我有2个线程,一个从rs232读/写,另一个读/写tcp / ip。当接收到RS232上的数据时,它设置AutoResetEvent
,因此主线程知道(通过RegisterWaitForSingleObject
)何时接收到新数据,因此它可以解析数据并将其发送到tcp客户端(反之亦然)
问题:我无法确定主线程何时完成其任务。设置事件后,主线程开始将数据发送到TCP客户端,但RS232线程立即尝试再次读取新数据。所以可能会发生,当主线程从RS232处理RxBuffer时,RxBuffer可能会被新数据覆盖。
我可以创建一个名为ManualRegisterEvent
的新onRXdataProcceded
,它会在主线程结束时触发,但这听起来不像是一种解决这个问题的干净方法。
问题:如何确保主线程已在RxBuffer
上完成其任务,因此允许RS232线程重用RxBuffer
执行新的Read
操作。
主线程:
TcpServer TCP = new TcpServer();
RS232Server RS232 = new RS232Server("COM5");
//[...]
ThreadPool.RegisterWaitForSingleObject(TCP.onNewDataRX, OnNewRX, TCP, -1, false);
ThreadPool.RegisterWaitForSingleObject(RS232.onNewDataRX, OnNewRX, RS232, -1, false);
//[...]
private static void OnNewRX(object o, bool timedOut)
{
//Send data from TCP to RS232
//and from RS232 to TCP
}
RS232读线程:
public byte[] RxBuffer;
const BufferSize = 255;
//[...]
while (rs232.IsOpen)
{
RxLen = rs232.Read(RxBuffer, 0, BufferSize);
onNewDataRX.Set();
//And now wait until the main thread has read the buffer
//so its safe to loop again and overwrite the buffer
//something like onNewDataRX.WaitNotOne(0);
}