我有一个包含一个工作线程的类,它从一个循环中的队列接收数据。
应用程序的另一部分从此类接收一个事件,该类为每个队列项引发该事件。
这些事件是异步触发的,因此在繁忙时间应用程序的其他部分可以同时处理多个事件。
这应该没问题,但我们发现了一个可能导致问题的场景。
在解决主要问题时,我们需要一个快速的解决方案。该框架是否提供了一种简单的方法,我可以强制工作线程在处理每个事件时等待(因此它们是按顺序处理的)?如果没有,实现这一点的最简单方法是什么?
我有一个包含一个工作线程的类,它从一个循环中的队列接收数据。
应用程序的另一部分从此类接收一个事件,该类为每个队列项引发该事件。
这些事件是异步触发的,因此在繁忙时间应用程序的其他部分可以同时处理多个事件。
这应该没问题,但我们发现了一个可能导致问题的场景。
在解决主要问题时,我们需要一个快速的解决方案。该框架是否提供了一种简单的方法,我可以强制工作线程在处理每个事件时等待(因此它们是按顺序处理的)?如果没有,实现这一点的最简单方法是什么?
一个简单的答案是 lock() 在事件处理程序中的单个对象上。所有的tads都将等待获得锁。
除非我不理解您的问题,否则 ManualResetEvent 类可能会对您有所帮助。您可以使用它来阻止下一个事件的触发,直到最后一个事件完成。
我的猜测是,您只想通过引发事件并直接调用方法来避免触发操作。
AFAIK 事件将是异步的,我不知道有任何“简单”的方法来改变它。
原来还有另一个答案。您可以将以下属性添加到方法中。
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.Synchronized)]
没有通用的方法。
最后,处理程序需要提供一种跟踪机制。
如果您使用 BeginInvoke,而不是直接引发事件,则可以使用包装器,在其中同步调用真实事件处理程序,然后异步引发包装器。包装器可以维护一个计数器(具有互锁操作)或根据您的需要设置一个事件。
就像是:
TheDelegate realHandler = theEvent;
var outer = this;
ThreadPool.QuereUserWorkItem(x => {
// Set start of handler
realHandler(outer, eventArgs);
// Set handler finished
};
所有接收队列读取工作线程引发的事件的事件处理程序都在队列读取工作线程中调用。只要事件处理程序不产生自己的线程,您就应该能够通过在队列读取工作线程上调用 Thread.Join() 来等待事件处理程序完成。