我有一个应用程序(.Net 3.5),它创建线程来向数据库写入内容,以便GUI不会阻塞。所有创建的线程都被添加到一个列表中,这样我就可以在应用程序关闭时为每个线程等待(Thread.Join)(当应用程序关闭时,可能并非所有线程都已完成,因此应用程序必须等待它们)。 由于列表,如果创建的线程太多(OutOfMemoryException),我会遇到一些严重的问题。我尝试从列表中删除已完成的线程,但不知何故,这不起作用。 是否有更好的方法来管理线程列表,所以我可以在完成后删除它们?
编辑:似乎修复它(每当添加一个线程时调用):
lock (m_threadLock)
{
m_threads.RemoveAll(x => x.ThreadState == ThreadState.Stopped);
}
答案 0 :(得分:1)
System.Threading.ThreadPool 和 SetMaxThreads 加上 QueueUserWorkItem 怎么样?
http://msdn.microsoft.com/en-US/library/system.threading.threadpool%28v=VS.80%29.aspx
答案 1 :(得分:1)
你不能继续创建新线程,同时保持旧线程,你将耗尽内存。
我尝试从列表中删除已完成的线程,但不知何故不起作用。
这是正确的道路,为什么不起作用?
答案 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。它允许您取消工作项或等待所有工作项完成。