Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在使用SetMaxThreads时避免OutOfMemoryException_C#_Multithreading - Fatal编程技术网

C# 如何在使用SetMaxThreads时避免OutOfMemoryException

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

我需要多次调用一个方法(千万次),因此我使用线程。但是当循环有我的方法的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...
}
ThreadPool.SetMaxThreads(50,50);
for(int i=0;i
1)您混淆了线程池线程和用户创建的线程

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

请参见线程池中最多有50个线程:

ThreadPool.SetMaxThreads(50, 50);
对循环没有影响,您尝试为每一行创建一个用户线程

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

  • 通过任务并行库(来自Framework 4.0)
  • 通过调用ThreadPool.QueueUserWorkItem
  • 通过异步委托
  • 通过后台工作
2) 您不应该创建那么多用户线程

我建议阅读:Joe Albahari出色的

1)你把线程池线程和用户创建的线程混淆了

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

请参见线程池中最多有50个线程:

ThreadPool.SetMaxThreads(50, 50);
对循环没有影响,您尝试为每一行创建一个用户线程

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

  • 通过任务并行库(来自Framework 4.0)
  • 通过调用ThreadPool.QueueUserWorkItem
  • 通过异步委托
  • 通过后台工作
2) 您不应该创建那么多用户线程


我建议阅读:Joe Albahari的优秀

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

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