管理线程列表

时间:2010-04-20 07:51:50

标签: c# multithreading

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

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

5 个答案:

答案 0 :(得分:1)

System.Threading.ThreadPool SetMaxThreads 加上 QueueUserWorkItem 怎么样?

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

答案 1 :(得分:1)

你不能继续创建新线程,同时保持旧线程,你将耗尽内存。

  

我尝试从列表中删除已完成的线程,但不知何故不起作用。

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

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

答案 2 :(得分:0)

不确定这是不是你想要的,但这样的事情呢?

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());

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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