2009-08-07 23 views
15

我有一个线程运行,委托出一些任务。当一项任务完成时,会引发一个事件,说明它已完成。这些任务需要按照特定的顺序运行,并且需要等待上一个任务完成。如何让线程等待,直到它收到“任务完成”事件? (除了显而易见的事件处理程序设置了一个标志,然后一个while循环轮询该标志)可以使用哪些方法使线程等待事件并继续执行?

回答

27

我经常使用的AutoResetEvent等待句柄,当我需要等待异步任务完成:

public void PerformAsyncTasks() 
{ 
    SomeClass someObj = new SomeClass() 
    AutoResetEvent waitHandle = new AutoResetEvent(false); 
    // create and attach event handler for the "Completed" event 
    EventHandler eventHandler = delegate(object sender, EventArgs e) 
    { 
     waitHandle.Set(); // signal that the finished event was raised 
    } 
    someObj.TaskCompleted += eventHandler; 

    // call the async method 
    someObj.PerformFirstTaskAsync();  
    // Wait until the event handler is invoked 
    waitHandle.WaitOne(); 
    // the completed event has been raised, go on with the next one 
    someObj.PerformSecondTaskAsync(); 
    waitHandle.WaitOne(); 
    // ...and so on 
} 
+1

根据第一个答案,我正在做一些与此非常相似的事情。使用EventResetMode.AutoReset初始化AutoResetEvent和EventWaitHandle有什么区别? – MGSoto 2009-08-07 18:38:04

+0

@MGoto:我认为差异很小(如果有的话):'AutoResetEvent'继承自'EventWaitHandle',并且似乎使用其基类的构造函数向其传递'EventResetMode.AutoReset'。 – 2009-08-07 18:51:28

+2

别忘了,AutoResetEvent,WaitHandles等实现了IDisposable – 2013-06-17 14:03:10

5

一个选项是使用EventWaitHandle来表示完成。

+0

能否详细说明一下?更好地解释这一点,我会绝对投票! – Firoso 2009-08-07 17:58:53

+1

+1。 @firoso在msdn文章中有很多细节。 – 2009-08-07 18:18:03

+0

包含多种语言的示例 – bdonlan 2009-08-07 18:19:03

1

你可以使用这个ManualResetEvent

需要首先处理的线程只需要resetEvent,并等待直到结束才能设置事件。

需要等待的线程可以持有它的句柄,并调用resetEvent.WaitOne()。这将阻止该线程,直到第一个完成。

这允许您以非常干净的方式处理事件的阻塞和排序。

0

通过使用工作线程完成时调用的回调方法,我得到了很好的结果。它击败了轮询,并且很容易将参数传回给调用者。

相关问题