线程,中止并等待

时间:2009-04-18 04:19:53

标签: c# multithreading

我正在中止一个线程(很快就会是线程)问题是我需要停止直到所有线程都被中止。

在完成Thread.Abort();后,我想到使用Thread.Join()等待它完全中止。然而,这不起作用。它只是永远等待。我如何中止每个线程并等到它完成后再继续?

附加信息:如果你好奇为什么 - 在这种情况下我关闭了一个窗口,我将一个委托函数传递给它完成(或中止)时调用的线程。如果我不停止,那么窗口将关闭,该函数将调用无效句柄/ objs。我可以轻松地使用相同的方法,在旗帜和循环中放置一个标志。睡觉直到所有标志都设置好但感觉不对。

2 个答案:

答案 0 :(得分:4)

我从多年的线程经验中了解到,有一些规则,如果遵循这些规则,可以让生活更轻松

与此问题相关的是:

  • 让线程控制自己的资源,包括它们的生命周期。

我不会中止一个线程,我只是在线程创建者和线程本身之间设置一个通信方法来通知线程终止,然后让线程本身关闭。

此方法通常可以像控制线程主循环的逐个创建者/线程读取标志一样简单。如果线程在循环中有长时间运行的任务,您还应该定期检查。

然后创建者线程应该加入,直到线程退出。如果设计得当,您可以设置上限时间。

答案 1 :(得分:1)

使用同步对象,例如Event。例如,每个后台线程都有一个与之关联的事件。当线程终止时,它会向事件发出信号。主线程在事件集上执行WaitHandle.WaitAll,并且仅在发出所有事件的信号时继续。

请注意,如果后台线程有可能需要很长时间才能终止,则在等待主线程时阻塞主线程会产生糟糕的用户体验。因此,如果是这种情况,您可能希望在阻止之前隐藏窗口。此外,您将要测试这对您的回调委托的影响 - 如果UI线程在等待中被阻止,它是否能够处理您的委托?

如果由于窗口关闭导致线程被杀死,可能不是更好的设计是不要调用委托?只是让主线程告诉后台线程它们为什么要终止,并让它们跳过回调,如果原因是“窗口关闭”。 (这假设您正在与线程进行通信,正如Pax正确推荐的那样,而不是仅仅调用Abort。)