[英]C# ThreadPool - OutOfMemoryException
我第一次为项目弄乱ThreadPools,并且需要能够在main方法的两个不同部分中对工作项进行排队。 我做了一个简单的示例进行测试,并在对象创建行的for循环中不断获取OutOfMemoryException。 为了释放该线程占用的任何内存,我需要在线程执行结束时执行某种清理吗? 如果没有,我该如何解决内存问题?
class Program
{
public static HashSet<String> domains;
static void Main(string[] args)
{
//Static DB Connection
//Database Set
domains = new HashSet<string>();
while (true)
{
//Pull Data From The Database
String[] chars = { "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l" };
for (int i = 0; i < 10; i++)
{
Loader l = new Loader(chars[i]);
if (!domains.Contains(chars[i]))
{
lock (domains)
{
domains.Add(chars[i]);
}
ThreadPool.QueueUserWorkItem(new WaitCallback(l.ThreadPoolCallback), i);
}
}
for (int i = 0; i < 10; i++)
{
Parser p = new Parser();
ThreadPool.QueueUserWorkItem(new WaitCallback(p.ThreadPoolCallback), i);
}
}
}
}
解析器类:
class Parser
{
public void ThreadPoolCallback(Object threadContext)
{
ManualResetEvent eventx = new ManualResetEvent(false);
//int threadIndex = (int)threadContext;
Console.WriteLine("Parser Thread: " + threadContext);
eventx.Set();
}
}
装载机类别:
class Loader
{
String ch { set; get; }
public Loader(String new_ch)
{
ch = new_ch;
}
public void ThreadPoolCallback(Object threadContext)
{
ManualResetEvent eventx = new ManualResetEvent(false);
Console.WriteLine("Added " + this.ch + " to " + Thread.CurrentThread.GetHashCode());
//int threadIndex = (int) threadContext;
//Console.WriteLine("Loader Thread: " + threadContext + " " + ch + " " + Thread.CurrentThread.GetHashCode());
lock(Program.domains)
{
Program.domains.Remove(this.ch);
Console.WriteLine("Removed " + this.ch + " from " + Thread.CurrentThread.GetHashCode());
}
eventx.Set();
}
}
谢谢你
编辑感谢您的所有帮助。 我现在看到自己犯的错误
您有一个无限的while循环,除了吐出新线程外什么也不做。 线程占用大量内存(32位为1MB; 64位为4MB),因此如果您不先耗尽线程限制,最终将耗尽内存。
另外-您对ManualResetEvent的使用不正确。 需要在方法范围之外创建它,否则它什么都不做(因为进入该方法的每个线程都将创建一个resetevent对象的新实例;为了进行同步,线程必须访问同一对象)。
尽管线程池限制了线程数,但是您的循环并没有限制队列中用户工作项的数量。 您的无限循环将耗尽mem。
就像罗肯所说的,两线之间的一切
while(true)
{
....
}
正在无限地重复。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.