如何在使用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...
}
1)将线程池线程与用户创建的线程混淆。
这将创建一个新线程(而不是线程池线程):
Thread t = new Thread(RegisterPerson);
看到线程池最多有50个线程:
ThreadPool.SetMaxThreads(50, 50);
对循环没有影响,在循环中,您尝试为每一行创建一个用户线程。
有很多方法可以进入线程池:
- 通过任务并行库(来自Framework 4.0)
- 通过调用ThreadPool。队列用户工作项
- 通过异步委托
- 通过BackgroundWorker
2) 您不应该创建那么多用户线程。
我建议阅读:Joe Albahari在C#中出色的线程化
与其手动创建那么多单独的线程,不如使用Parallel。ForEach(),并让它为您处理线程创建。它们不会同时运行,但不会遇到内存问题。