我想让主线程产生线程,并且能够在不等待所有线程完成的情况下继续产生更多的线程。线程的产生是由用户控制的,因此用户可以在不同的时间段添加更多线程。
事情是......当主线程正在运行finalize时,我怎么能这样做呢。在finalize中,让它等到所有活动线程都完成。
答案 0 :(得分: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
的所有线程完成执行之前,您的进程将保持活动状态(即使没有窗口)。同样用于垃圾收集;在你的堆对象不再从任何活动线程中引用之前,它们将不会被最终确定,而不仅仅是主要的。