2012-01-20 35 views
1

我想让主线程产生线程并且能够继续产生更多的输出,等待所有线程完成。线程的产生是用户控制的,所以用户可以在不同的时间段添加更多的线程。主线程在finalize c中等待线程#

事情是...当主线程正在运行finalize时,我该如何做到这一点。在完成之前让它等到所有活动线程完成。

+1

是否正确使用.join()方法? – Ismael

+2

您的问题中缺少一些东西:您说用户可以在不同的时间段添加线程。我的问题是:主线程在等待用户时会做什么?主线程如何知道用户没有更多的线程要添加? –

回答

2

记录所有创建的线程;例如,通过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的所有线程完成执行。垃圾收集同样如此;你的堆对象不会被终结,直到它们不再被任何活线程引用,而不仅仅是主线程。

+0

我真的不需要Thread.Join,因为我不需要线程的任何回报。我需要的是让主线程准备好接收越来越多的线程,而产生的线程完成工作。 这是非常有趣的代码,我工作得很好。我错过的是IsBackground = false;线。我有这个真实的,所以当主线程终止产生的线程随之而来。 – user1161221

+0

在这种情况下使用术语“背景”是有误导性的。开发人员最初认为所有线程都是后台线程,除了主线程之外,这是很常见的。很高兴有帮助! – Douglas