C# 如何在使用SetMaxThreads时避免OutOfMemoryException
我需要多次调用一个方法(千万次),因此我使用线程。但是当循环有我的方法的100个循环时,它会启动OutOfMemoryException。 我尝试添加SetMaxThreads以仅同时运行50个线程,但不起作用(因为我不知道如何做)。提前谢谢C# 如何在使用SetMaxThreads时避免OutOfMemoryException,c#,multithreading,C#,Multithreading,我需要多次调用一个方法(千万次),因此我使用线程。但是当循环有我的方法的100个循环时,它会启动OutOfMemoryException。 我尝试添加SetMaxThreads以仅同时运行50个线程,但不起作用(因为我不知道如何做)。提前谢谢 ThreadPool.SetMaxThreads(50, 50); for (int i = 0; i < tablePersons.Rows.Count; i++) { Thread t = new Thread(RegisterPerso
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...
}
ThreadPool.SetMaxThreads(50,50);
for(int i=0;i
1)您混淆了线程池线程和用户创建的线程
这将创建一个新线程(不是线程池线程):
请参见线程池中最多有50个线程:
ThreadPool.SetMaxThreads(50, 50);
对循环没有影响,您尝试为每一行创建一个用户线程
有多种方法可以进入线程池:
- 通过任务并行库(来自Framework 4.0)
- 通过调用ThreadPool.QueueUserWorkItem
- 通过异步委托
- 通过后台工作
ThreadPool.SetMaxThreads(50, 50);
对循环没有影响,您尝试为每一行创建一个用户线程
有多种方法可以进入线程池:
- 通过任务并行库(来自Framework 4.0)
- 通过调用ThreadPool.QueueUserWorkItem
- 通过异步委托
- 通过后台工作
我建议阅读:Joe Albahari的优秀与其手动创建那么多单独的线程,不如使用Parallel.ForEach(),让它为您处理线程创建。
它们不会同时运行,但不会出现内存问题。与其手动创建那么多单独的线程,不如使用Parallel.ForEach(),让它为您处理线程创建。 它们不会同时运行,但您不会遇到内存问题