我尝试使用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
下面的代码仅在竞争后运行线程正在等待。
我不知道自己是否足够清楚,所以我很乐意根据需要添加细节。提前谢谢。
答案 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)更快,因为它受到单个进程的限制。如果你不需要在另一个程序中使用锁,那么当然。