如何在使用SetMaxThreads时避免OutOfMemoryException

本文关键字:OutOfMemoryException SetMaxThreads | 更新日期: 2023-09-27 17:57:51

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

如何在使用SetMaxThreads时避免OutOfMemoryException

1)将线程池线程与用户创建的线程混淆。

这将创建一个新线程(而不是线程池线程):

Thread t = new Thread(RegisterPerson);

看到线程池最多有50个线程:

ThreadPool.SetMaxThreads(50, 50);

对循环没有影响,在循环中,您尝试为每一行创建一个用户线程。

有很多方法可以进入线程池:

  • 通过任务并行库(来自Framework 4.0)
  • 通过调用ThreadPool。队列用户工作项
  • 通过异步委托
  • 通过BackgroundWorker

2) 您不应该创建那么多用户线程。

我建议阅读:Joe Albahari在C#中出色的线程化

与其手动创建那么多单独的线程,不如使用Parallel。ForEach(),并让它为您处理线程创建。它们不会同时运行,但不会遇到内存问题。

相关文章:
  • 没有找到相关文章