我有如下代码:
public void MethodA()
{
MyManualResetEvent.Reset();
}
public void MethodB()
{
MyManualResetEvent.Set();
}
如果另一个线程调用了
MyManualResetEvent.WaitOne()
而不是MethodA
,则使用MethodB
停止线程时此方法有效。我现在想做的是能够调用
MethodA
两次,而另一个线程仅在MethodB
被调用两次而不是一次的情况下才继续。我希望System.Threading命名空间中有我不知道的东西。
最佳答案
假设您不需要在调用即时BlockedMethod
时停止并发执行的MethodA
,那么使用标准Monitor类可能最容易解决此问题。 MethodA
和MethodB
共享一个计数器,该计数器记录MethodA
被调用了多少次而没有相应地调用MethodB
。仅当该计数为0时,才会继续执行BlockedMethod
方法;如果没有,它将等待MethodB
发出信号,表明该该继续了。
object mylock = new object();
int count = 0;
public void MethodA()
{
// record that MethodA is executing
lock (mylock)
count++;
// other code...
}
public void MethodB()
{
// other code...
lock (mylock)
{
// MethodB has now finished running
count--;
// wake up other thread because it may now be allowed to run
Monitor.Pulse(mylock);
}
}
public void BlockedMethod()
{
// wait until the number of calls to A and B is equal (i.e., count is 0)
lock (mylock)
{
while (count != 0)
Monitor.Wait(mylock);
}
// calls to A and B are balanced, proceed...
}