使用SetMaxThreads时如何避免OutOfMemoryException

时间:2013-02-05 14:33:36

标签: c# multithreading

我需要多次调用一个方法(十万),因此我使用线程。但是当循环有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...
}

2 个答案:

答案 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(),并让它为您处理线程创建。 它们不会同时运行,但您不会遇到内存问题。