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... } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |