如何等待线程完成其工作

Ser*_*gel 0 c# multithreading

我有一个控制台应用程序.一个类(比如说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 }
Run Code Online (Sandbox Code Playgroud)

编辑:更正了语句的顺序,但这不是问题.

Gre*_*ech 15

你有一个竞争条件,因为工作可以在你注册参加比赛之前完成.为了避免竞争条件,更改代码的顺序,以便在开始工作之前注册事件,然后无论它完成多快,它总是会被引发:

static void Main(string[] args)
{
    Worker worker = new Worker();
    worker.WorkCompleted += PostProcess;
    worker.DoWork();
}
Run Code Online (Sandbox Code Playgroud)

编辑:

好的问题已被修改,所以看起来你真正问的是如何等待PostProcess完成执行.有几种方法可以做到这一点,但你必须添加更多的代码.

最简单的方法是,因为事件总是因为他们提出了相同的线程上执行,是调用Thread.Join线程上的Worker类创建,例如,假设线程公开为一个属性:

worker.Thread.Join();
Run Code Online (Sandbox Code Playgroud)

(虽然说实话,我可能会保留Thread私有,并公开一种类似于调用它WaitForCompletionWorker类的方法).

替代方法是:

  1. 在课堂上有一个WaitHandle,可能是一个ManualResetEvent,当它完成所有的工作,并呼吁它.WorkerSetWaitOne

  2. volatile bool completeWorker类中有一个字段并在等待它设置时循环true,Thread.Sleep在循环体中使用(这可能不是一个好的解决方案,但它是可行的).

可能还有其他选择,但这是常见的选择.