我有如下代码:

public void MethodA()
{
    MyManualResetEvent.Reset();
}

public void MethodB()
{
    MyManualResetEvent.Set();
}

如果另一个线程调用了MyManualResetEvent.WaitOne()而不是MethodA,则使用MethodB停止线程时此方法有效。

我现在想做的是能够调用MethodA两次,而另一个线程仅在MethodB被调用两次而不是一次的情况下才继续。

我希望System.Threading命名空间中有我不知道的东西。

最佳答案

假设您不需要在调用即时BlockedMethod时停止并发执行的MethodA,那么使用标准Monitor类可能最容易解决此问题。 MethodAMethodB共享一个计数器,该计数器记录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...
}

10-08 14:48