2009-02-24 33 views
4

我有一个类包含一个工作线程,它从循环中的队列接收数据。C#.NET 3.5:如何调用事件处理程序并等待它完成

该应用程序的另一部分吸收了该类中的事件,该类为每个队列项引发。

这些事件是异步触发的,所以在繁忙的时候,应用的其他部分可以同时处理多个事件。

这应该没问题,但我们发现了一个可能导致问题的场景。

我们需要一个快速解决方案,同时解决主要问题。框架是否提供了一种简单的方法,我可以强制工作线程在每个事件得到处理时等待(以便按顺序处理)?如果没有,那么实现这个最简单的方法是什么?

+0

你的代码的一个小例子会有帮助,对'event'这个词有多重含义。 – AnthonyWJones 2009-02-24 17:17:41

+0

奇怪的问题,你基本上是说“我异步提高事件,但我想同步做”。事件是默认同步提升的,只是不要做异步引发它们的额外工作。 – 2009-02-24 17:37:35

回答

4

一个简单的答案是锁定事件处理程序中的单个对象。所有的队伍都会等待锁定。

0

没有一般的方法。

最后,处理程序需要提供跟踪机制。

如果您使用的是BeginInvoke,而不是直接引发事件,则可以使用包装器,在该包装器中同步调用真实事件处理程序,然后异步提升包装器。包装可以维护一个计数器(使用互锁操作)或设置一个事件以满足您的需求。

喜欢的东西:

TheDelegate realHandler = theEvent; 
var outer = this; 
ThreadPool.QuereUserWorkItem(x => { 
    // Set start of handler 
    realHandler(outer, eventArgs); 
    // Set handler finished 
}; 
0

所有事件处理程序下沉由队列读取工作线程引发的事件被称为队列中读辅助线程。只要事件处理程序不会产生它们自己的线程,您应该能够通过调用队列读取工作线程上的Thread.Join()来等待事件处理程序完成。

1

我的猜测是,你想简单地通过引发一个事件并直接调用方法来触发动作。

AFAIK事件将是异步的,我不知道有任何“简单”的方法来改变它。

3

ManualResetEvent class可能会帮助你,除非我不理解你的问题。您可以使用它来阻止下一个事件的触发,直到最后一个事件完成。

1

原来还有另一个答案。您可以将以下属性添加到方法中。

[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.Synchronized)]