【问题标题】:main thread waits for threads in the finalize c#主线程在finalize c#中等待线程
【发布时间】:2012-01-21 04:22:05
【问题描述】:

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

问题是......当主线程正在运行 finalize 时,我该怎么做。在 finalize 中让它等到所有活动线程都完成。

【问题讨论】:

  • 这是关于正确使用 .join() 方法吗?
  • 您的问题中缺少一些东西:您说用户可以在不同的时间段添加线程。我的问题是:主线程在等待用户时会做什么?主线程如何知道用户没有更多线程要添加?

标签: c# multithreading


【解决方案1】:

跟踪您创建的所有线程;例如,通过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 的线程完成执行。垃圾收集也是如此;在不再从 any 活动线程中引用它们之前,您的堆对象不会被最终确定,而不仅仅是主线程。

【讨论】:

  • 我真的不需要 Thread.Join,因为我不需要线程的任何返回。我所需要的只是让主线程准备好接收越来越多的线程,同时衍生线程完成工作。这太有趣了,我的代码运行良好。我缺少的是 IsBackground=false;线。我确实做到了这一点,所以当主线程终止时,生成的线程就会随之而来。
  • 在这种情况下使用“背景”一词具有误导性。开发人员通常会最初假设所有线程都是后台线程,除了主线程。很高兴能帮上忙!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-21
  • 1970-01-01
  • 2023-03-11
相关资源
最近更新 更多