代码之家  ›  专栏  ›  技术社区  ›  MGSoto

哪些方法可以使线程等待事件,然后继续执行?

  •  15
  • MGSoto  · 技术社区  · 17 年前

    我有一个线程在运行,它委托一些任务。当单个任务完成时,会引发一个事件,表示它已完成。这些任务需要以特定的顺序运行,并且需要等待上一个任务完成。如何使线程等待直到它收到“任务已完成”事件?(除了设置标志的明显事件处理程序,然后是while循环轮询标志)

    4 回复  |  直到 11 年前
        1
  •  27
  •   Fredrik Mörk    17 年前

    我经常使用 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
    }
    
        2
  •  5
  •   bdonlan    17 年前

    一种选择是使用 EventWaitHandle 表示完成。

        3
  •  1
  •   Reed Copsey    17 年前

    你可以使用 ManualResetEvent 为此。

    需要首先处理的线程只接受resetevent,并等待到结束设置事件。

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

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

        4
  •  0
  •   Ed Power    17 年前

    通过使用一个回调方法,我已经取得了很好的效果,当工作线程完成时它会调用这个回调方法。它比轮询更容易将参数传回调用者。