0

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

2 回答 2

2

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

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

Thread t = new Thread(RegisterPerson);

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

ThreadPool.SetMaxThreads(50, 50);

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

进入线程池有多种方式:

  • 通过任务并行库(来自 Framework 4.0)
  • 通过调用 ThreadPool.QueueUserWorkItem
  • 通过异步委托
  • 通过 BackgroundWorker

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

我建议阅读:Joe Albahari 的优秀C# 线程

于 2013-02-05T14:35:59.953 回答
1

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

于 2013-02-05T14:38:02.737 回答