当前位置:  开发笔记 > 编程语言 > 正文

如何等待线程完成其工作

如何解决《如何等待线程完成其工作》经验,为你挑选了1个好方法。

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

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



1> Greg Beech..:

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

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

编辑:

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

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

worker.Thread.Join();

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

替代方法是:

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

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

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

推荐阅读
135369一生真爱_890
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有