【问题标题】:Managing a list of threads管理线程列表
【发布时间】:2011-02-10 00:50:23
【问题描述】:

我有一个应用程序 (.Net 3.5),它创建线程以将某些内容写入数据库,这样 GUI 就不会阻塞。所有创建的线程都被添加到一个列表中,这样我可以在应用程序关闭时等待(Thread.Join)每个线程(可能在应用程序关闭时并非所有线程都完成,因此应用程序必须等待它们)。 由于列表的原因,如果创建了太多线程(OutOfMemoryException),我会遇到一些严重的问题。我尝试从列表中删除已完成的线程,但不知何故这不起作用。 是否有更好的方法来管理线程列表,以便在它们完成后将它们删除?

编辑:似乎已修复它(每当添加线程时调用):
lock (m_threadLock)
{
m_threads.RemoveAll(x => x.ThreadState == ThreadState.Stopped);
}

【问题讨论】:

  • 为什么不通过 BeginInvoke 使用 .net 托管线程池来更新用户界面?
  • 线程不会更新 GUI,但用户可能想要停止进程或退出应用程序。
  • @Aseem:线程池没有解决等待直到完成的问题。

标签: c# multithreading


【解决方案1】:

使用更高级的ThreadPool,例如:http://www.codeproject.com/KB/threads/smartthreadpool.aspx。它允许您取消工作项或等待所有工作项完成。

【讨论】:

    【解决方案2】:

    你不能在保留旧线程的同时继续创建新线程,你会耗尽内存。

    我尝试从列表中删除已完成的线程,但不知何故没有奏效。

    那是正确的道路,为什么它不起作用?

    1. 将代码添加到您的线程方法中以发出完成信号(可能将它们从列表中删除)。
    2. 寻找自定义线程池。发布了几个实现。您可以使用一个简单的并控制 Background=false 和其他细节。

    【讨论】:

    • 我至少在一年前开发了这个应用程序(使用 C# 2.0),所以我不知道问题出在哪里。我现在正在对此进行测试,也许可行: m_threads.RemoveAll(x => x.ThreadState == ThreadState.Stopped);
    【解决方案3】:

    OutOfMemoryException 似乎不是由线程 list 引起的那种事情 - 更有可能是因为线程本身,即。你创造了太多。如果已经有太多,您需要重新使用现有的并等待它们可用。这正是 线程池 所做的。如果内置的 .NET 不支持等待线程,那么您只需要找到第三方实现,或者,最糟糕的情况是,自己编写 - 可能使用内置的作为指南.

    【讨论】:

    • 我自己编写过一次实现,它在相当大的环境中仍然可以正常工作,但是测试它真的很痛苦,而且花费了相当多的时间。我推荐线程池。
    【解决方案4】:

    不确定这是否是您想要的,但是像这样的东西怎么样?

    Action foo = () =>
    {
        Thread.Sleep(1000);
    };
    
    var handles = new List<WaitHandle>();
    for (int i = 0; i < 10; i++)
    {
        var result = foo.BeginInvoke(r =>
        {
            foo.EndInvoke(r);
        }, null);
        handles.Add(result.AsyncWaitHandle);
    }
    
    WaitHandle.WaitAll(handles.ToArray());
    

    【讨论】:

      【解决方案5】:

      System.Threading.ThreadPoolSetMaxThreads 以及 QueueUserWorkItem 怎么样?

      http://msdn.microsoft.com/en-US/library/system.threading.threadpool%28v=VS.80%29.aspx

      【讨论】:

      • 线程池中的所有线程都是后台线程,当应用程序关闭时我不能等待它们(不支持)。但我必须等他们完成。
      • 拦截应用的关闭事件,等到GetMaxThreads == GetAvailableThreads怎么样?您甚至可以让 GUI 隐藏并保持进程直到工作完成。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-08
      • 1970-01-01
      • 2018-06-27
      • 1970-01-01
      • 2011-01-10
      相关资源
      最近更新 更多