2013-06-20 21 views
0

我有一个主线程通过实现基于事件的异步模式的类启动一些工作线程(http://msdn.microsoft.com/en-us/library/ms228969.aspx)。不幸的是,一旦主线程完成了工作线程的设置,它就会退出。如何在使用基于事件的异步模式时让主线程等待其他线程?

我希望主线程无限期地等待,直到anEventHandler方法被调用,然后处理该方法。 asyncevents无限期地监听事件直到取消,因此他们可能会在完成之前多次调用anEventHandler方法。

注意:没有相关的GUI,我只是使用这种模式。

public static void Main(String[] args) { 
     AsyncEventClass asyncevent = new AsyncEventClass(); 

     // setup event handling 
     asyncevent.Events += new EventsHandler(anEventHandler); 

     // start event monitoring threads 
     asyncevent.monitorAsync(1); 
     asyncevent.monitorAsync(2); 
     asyncevent.monitorAsync(3); 

     System.Console.WriteLine("The main thread now ends. :("); 
    } 

所有的例子在线使用System.Console.ReadLine(),但是,似乎是在生产代码中一个可怕的想法。

+0

我想我可以公开AsyncEventClass通过实现基于事件的异步模式创建的IAsyncResult,然后等待。有没有更好的办法?如果可能的话,我想避免暴露(出于耦合的原因)。 – jtfairbank

+0

你必须使用这种模式吗?如果你能够使用任务,它使生活变得更简单。 –

回答

0

我最终通过调用WorkerEventHandler.BeginInvoke将所有IAsyncResutl对象返回到列表中,然后将该列表暴露给Main方法。在那里,我设置了所有需要侦听的事件,然后使用WaitHandle.WaitAll等待事件完成。

2

您可以使用简单的AutoResetEvent,您可以在主要方法中等待并在事件处理程序中进行设置。

如果您想等待事件处理程序被调用的特定次数,我想您可以保留一个计数器,并且只有当您达到某个阈值时才设置自动重置事件。