我有一个控制台应用程序.一个类(比如说Worker)在一个单独的线程中做一些工作,并在它完成时抛出一个事件.但这绝不会发生,因为执行立即结束.如何在线程抛出后等待线程完成并处理事件?
static void Main(string[] args) { Worker worker = new Worker(); worker.WorkCompleted += PostProcess; worker.DoWork(); } static void PostProcess(object sender, EventArgs e) { // Cannot see this happening }
编辑:更正了语句的顺序,但这不是问题.
你有一个竞争条件,因为工作可以在你注册参加比赛之前完成.为了避免竞争条件,更改代码的顺序,以便在开始工作之前注册事件,然后无论它完成多快,它总是会被引发:
static void Main(string[] args) { Worker worker = new Worker(); worker.WorkCompleted += PostProcess; worker.DoWork(); }
编辑:
好的问题已被修改,所以看起来你真正问的是如何等待PostProcess
完成执行.有几种方法可以做到这一点,但你必须添加更多的代码.
最简单的方法是,因为事件总是因为他们提出了相同的线程上执行,是调用Thread.Join
线程上的Worker
类创建,例如,假设线程公开为一个属性:
worker.Thread.Join();
(虽然说实话,我可能会保留Thread
私有,并公开一种类似于调用它WaitForCompletion
的Worker
类的方法).
替代方法是:
在课堂上有一个WaitHandle
,可能是一个ManualResetEvent
,当它完成所有的工作,并呼吁它.Worker
Set
WaitOne
volatile bool complete
在Worker
类中有一个字段并在等待它设置时循环true
,Thread.Sleep
在循环体中使用(这可能不是一个好的解决方案,但它是可行的).
可能还有其他选择,但这是常见的选择.