在继续之前如何等待达到 ManualResetEvent.WaitOne() ?
How to wait for ManualResetEvent.WaitOne() to be reached before moving on?
我正在尝试使用 ManualResetEvent 来创建类似信号灯的情况,并且我已将 WaitOne
、Set
和 Reset
放在正确的位置。 WaitOne
指令在侦听器线程中调用,并在 tcp 读取之后立即放置:
var networkStream = _clientSocket.GetStream();
networkStream.Read(bytesFrom, 0, Convert.ToInt32(_clientSocket.ReceiveBufferSize));
_mainthreadControl.WaitOne(Timeout.Infinite);
并且 Set
和 Reset
指令在另一个线程中调用,因此套接字不会被竞争:
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)更快,因为它受单个进程的限制。如果当然如果你不需要在另一个程序中使用锁。
我正在尝试使用 ManualResetEvent 来创建类似信号灯的情况,并且我已将 WaitOne
、Set
和 Reset
放在正确的位置。 WaitOne
指令在侦听器线程中调用,并在 tcp 读取之后立即放置:
var networkStream = _clientSocket.GetStream();
networkStream.Read(bytesFrom, 0, Convert.ToInt32(_clientSocket.ReceiveBufferSize));
_mainthreadControl.WaitOne(Timeout.Infinite);
并且 Set
和 Reset
指令在另一个线程中调用,因此套接字不会被竞争:
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)更快,因为它受单个进程的限制。如果当然如果你不需要在另一个程序中使用锁。