主线程在finalize c#中等待线程

时间:2012-01-20 18:34:36

标签: c# multithreading

我想让主线程产生线程,并且能够在不等待所有线程完成的情况下继续产生更多的线程。线程的产生是由用户控制的,因此用户可以在不同的时间段添加更多线程。

事情是......当主线程正在运行finalize时,我怎么能这样做呢。在finalize中,让它等到所有活动线程都完成。

1 个答案:

答案 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的所有线程完成执行之前,您的进程将保持活动状态(即使没有窗口)。同样用于垃圾收集;在你的堆对象不再从任何活动线程中引用之前,它们将不会被最终确定,而不仅仅是主要的。