加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 多等待句柄

发布时间:2020-12-16 01:45:42 所属栏目:百科 来源:网络整理
导读:我有以下代码: public void MethodA(){ MyManualResetEvent.Reset();}public void MethodB(){ MyManualResetEvent.Set();} 当使用MyManualResetEvent.WaitOne()来停止线程时,如果另一个线程调用了MethodA而不是MethodB,则此方法有效. 我现在要做的是能够两
我有以下代码:

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

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

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

我现在要做的是能够两次调用MethodA,另一个线程只在MethodB被调用两次时才继续,而不是只调用一次.

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

解决方法

假设您不需要停止同时执行的BlockedMethod即可调用MethodA,这可能最容易通过标准的 Monitor类来解决. MethodA和MethodB共享一个计数器,该计数器记录在没有对MethodB的相应调用的情况下调用MethodA的次数. BlockedMethod方法仅在该计数为0时才进行;如果没有,它等待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...
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读