如何在继续之前等待手动接触ManualResetEvent.WaitOne()?

时间:2017-01-30 11:13:54

标签: c# multithreading manualresetevent

我尝试使用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下面的代码仅在竞争后运行线程正在等待。

我不知道自己是否足够清楚,所以我很乐意根据需要添加细节。提前谢谢。

1 个答案:

答案 0 :(得分:2)

如果它适合你。请尝试使用其他AutoResetEvent。像这样:

SELECT CUSTOMER, COUNT(LIKED) AS TOTAL_LIKES
FROM TABLE
WHERE LIKED = 'true'
GROUP BY CUSTOMER

反过来我建议使用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 } 类,因为它比ManualResetEvent(false)更快,因为它受到单个进程的限制。如果你不需要在另一个程序中使用锁,那么当然。