繁体   English   中英

C# .NET 3.5:如何调用事件处理程序并等待它完成

[英]C# .NET 3.5 : How to invoke an event handler and wait for it to complete

我有一个 class 包含一个工作线程,该线程从循环中的队列接收数据。

应用程序的另一部分从该 class 接收一个事件,class 为每个队列项引发该事件。

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

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

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

一个简单的答案是 lock() 在事件处理程序中的单个 object 上。 所有的tads都将等待获得锁。

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

我的猜测是,您只想通过引发事件并直接调用该方法来使 go 远离触发动作。

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() 来等待事件处理程序完成。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM