我需要多次调用一个方法(十万),因此我使用线程。但是当循环有100个循环的方法时,它会启动OutOfMemoryException。 我尝试添加SetMaxThreads只能同时运行50个线程但不起作用(因为我不知道该怎么做)。提前谢谢。
ThreadPool.SetMaxThreads(50, 50);
for (int i = 0; i < tablePersons.Rows.Count; i++)
{
Thread t = new Thread(RegisterPerson);
t.Start(tablePersons.Rows[i]);
}
static void RegisterPerson(object paramObject)
{
DataRow person = (DataRow)paramObject;
Call a service...
}
答案 0 :(得分:2)
1)您将线程池线程与用户创建的线程混淆。
这会创建一个新线程(不是线程池线程):
Thread t = new Thread(RegisterPerson);
将Threadpool设置为最多包含50个线程:
ThreadPool.SetMaxThreads(50, 50);
对您的循环没有影响,您尝试为每一行创建用户线程。
有多种方法可以进入线程池:
- 通过任务并行库(来自Framework 4.0)
- 通过调用ThreadPool.QueueUserWorkItem
- 通过异步委托
- 通过BackgroundWorker
2)你不应该创建那么多用户线程。
我建议阅读:Joe Albahari的优秀Threading in C#
答案 1 :(得分:1)
不是手动创建那么多单独的线程,而应该使用Parallel.ForEach(),并让它为您处理线程创建。 它们不会同时运行,但您不会遇到内存问题。