在继续之前如何等待达到 ManualResetEvent.WaitOne() ?

How to wait for ManualResetEvent.WaitOne() to be reached before moving on?

我正在尝试使用 ManualResetEvent 来创建类似信号灯的情况,并且我已将 WaitOneSetReset 放在正确的位置。 WaitOne 指令在侦听器线程中调用,并在 tcp 读取之后立即放置:

var networkStream = _clientSocket.GetStream();
networkStream.Read(bytesFrom, 0, Convert.ToInt32(_clientSocket.ReceiveBufferSize));
_mainthreadControl.WaitOne(Timeout.Infinite);

并且 SetReset 指令在另一个线程中调用,因此套接字不会被竞争:

try
{
    //some code
    _mainthreadControl.Reset();
    //some code that uses the same socket as above
    _mainthreadControl.Set();
}
catch (Exception ex)
{
    //ignored
}

但是我需要代码在到达 Reset 时停止,并且只有在到达 WaitOne 之后才继续(并执行),所以下面的代码 Reset 只在之后运行竞争线程正在等待。

不知道我说的够不够清楚,所以很高兴根据需要添加详细信息。提前致谢。

如果它适合你。请尝试使用额外的 AutoResetEvent。像这样:

var _additionalControl = new AutoResetEvent(false);

// code gap

var networkStream = _clientSocket.GetStream();
networkStream.Read(bytesFrom, 0, Convert.ToInt32(_clientSocket.ReceiveBufferSize));
_additionalControl.Set();
_mainthreadControl.WaitOne(Timeout.Infinite);

// code gap

try
{
  //some code
  _mainthreadControl.Reset();
  _additionalControl.WaitOne(Timeout.Infinite);
   //some code that uses the same socket as above

  _mainthreadControl.Set();
}
catch (Exception ex)
{
  //ignored
}

反过来我推荐使用System.Threading.Monitor class,因为它比ManualResetEvent(false)更快,因为它受单个进程的限制。如果当然如果你不需要在另一个程序中使用锁。