等待ResetEvent重置

时间:2017-08-04 15:24:33

标签: c# multithreading events

我想要的是什么:我有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);
}

0 个答案:

没有答案