我想让主线程产生线程并且能够继续产生更多的输出,等待所有线程完成。线程的产生是用户控制的,所以用户可以在不同的时间段添加更多的线程。主线程在finalize c中等待线程#
事情是...当主线程正在运行finalize时,我该如何做到这一点。在完成之前让它等到所有活动线程完成。
我想让主线程产生线程并且能够继续产生更多的输出,等待所有线程完成。线程的产生是用户控制的,所以用户可以在不同的时间段添加更多的线程。主线程在finalize c中等待线程#
事情是...当主线程正在运行finalize时,我该如何做到这一点。在完成之前让它等到所有活动线程完成。
记录所有创建的线程;例如,通过List<Thread>
集合。当您在finalize
方法是,只是遍历所有的线程并调用它们Join
方法顺序,如下面的WaitForThreads
方法:
private readonly List<Thread> threads = new List<Thread>();
public void SpawnThread(Action action)
{
Thread thread = new Thread(new ThreadStart(action));
thread.IsBackground = false;
threads.Add(thread);
thread.Start();
}
private void WaitForThreads()
{
foreach (Thread thread in threads)
thread.Join();
}
Thread.Join
阻塞调用线程(这应该是你的主线程)直到特定线程终止。如果线程已经被终止,那么这个调用会立即返回(这就是为什么你不需要在终止时从集合中删除线程的原因,尽管你仍然应该为了垃圾收集)。
另外,您应该考虑为什么您需要等待线程在finalize
方法中终止。如果仅仅是为了防止它们在主线程终止时被强行中止,那么就没有必要;您的进程将保持活动状态(即使没有窗口),直到IsBackground
属性为false
的所有线程完成执行。垃圾收集同样如此;你的堆对象不会被终结,直到它们不再被任何活线程引用,而不仅仅是主线程。
我真的不需要Thread.Join,因为我不需要线程的任何回报。我需要的是让主线程准备好接收越来越多的线程,而产生的线程完成工作。 这是非常有趣的代码,我工作得很好。我错过的是IsBackground = false;线。我有这个真实的,所以当主线程终止产生的线程随之而来。 – user1161221
在这种情况下使用术语“背景”是有误导性的。开发人员最初认为所有线程都是后台线程,除了主线程之外,这是很常见的。很高兴有帮助! – Douglas
是否正确使用.join()方法? – Ismael
您的问题中缺少一些东西:您说用户可以在不同的时间段添加线程。我的问题是:主线程在等待用户时会做什么?主线程如何知道用户没有更多的线程要添加? –