我有一段代码有两个事件处理程序。我希望这两个事件处理程序通知另一种方法,即有一些工作要做。C#事件多个发布者到一个订阅者
我已经实现了这个使用ManualResetEvent,但我不确定这是否是实现我想要的最好方法,或者是否有更好的方法。
static ManualResetEvent autoEvent = new ManualResetEvent(false);
void begin() {
ThreadPool.QueueUserWorkItem(new WaitCallback(genericHandler));
}
void OnEvent1(object sender) {
autoEvent.Set();
}
void OnEvent2(object sender) {
autoEvent.Set();
}
void genericHandler(object info) {
while (true) {
autoEvent.WaitOne();
// do some work
}
}
一个我拥有的最重要的问题是:autoEvent.WaitOne()
后,我做了一些工作,这些工作耗费的时间。与此同时,另一个事件被触发,并且在genericHandler再次获得WaitOne()
之前调用Set()
。当再次到达WaitOne时,它是否会等待另一个Set()
,或者在达到WaitOne()
之前调用Set()
之前继续?
这是在C#中实现多个发布者和一个订户模式的最佳方式吗?或者我应该使用另一件事物而不是ManualResetEvent?
注意:genericHandler位于不同的线程中,因为Event1和Event2具有不同的优先级,所以在处理程序中,我会在检查Event2之前检查Event1是否有挂起的工作。
如果在我做这项工作时有两个信号会怎么样? WaitOne会知道Set()被调用两次,而不是等到另一个Set被调用? – BlunT 2014-11-04 18:03:05
@BlunT号对于这种行为,你需要一个'Semaphore',它将是一个围绕一个整数的线程安全包装,而不是一个MRE,它在概念上是布尔“isSignaled”值的包装。 – Servy 2014-11-04 18:04:25
好吧,那正是我的恐惧。我看了Semaphore,但我认为Release是不合适的。也许我错过了一些东西。我需要一些增量方法,然后WaitOne()在处理程序的权利?我应该用什么来保持增加信号计数,而不是Set()? – BlunT 2014-11-04 18:08:35