2013-02-05 2 views
0

여러 번 (10 밀론) 메서드를 호출해야하므로 스레드를 사용해야합니다. 하지만 루프가 내 메서드의 100 사이클을 가지고있을 때 OutOfMemoryException을 시작합니다. SetMaxThreads를 추가하여 50 개의 스레드를 동시에 실행하려고 시도했지만 작동하지 않습니다 (어떻게 수행해야할지 모르기 때문에). 미리 감사드립니다.SetMaxThreads를 사용할 때 OutOfMemoryException을 피하는 방법

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

오히려 많은 별도의 스레드가 수동으로, 당신은 아마 Parallel.ForEach()를 사용, 그리고 당신을 위해 스레드 생성을 처리하도록해야 함을 만드는 것보다. 이들 모두 동시에 실행되지는 않지만 메모리 문제는 발생하지 않습니다.

+0

감사합니다. 그것은 작동합니다. – sebagiar

2

1) 스레드 풀 스레드를 사용자 생성 스레드와 혼동하고 있습니다.

이 새 스레드 (안 스레드 풀 스레드)를 작성 :

Thread t = new Thread(RegisterPerson); 

오십 개 스레드의 최대해야하는 스레드 풀을 Seeting :

ThreadPool.SetMaxThreads(50, 50); 

은 루프에 영향을 미치지 않습니다 각 행에 대해 사용자 스레드를 작성하려고합니다.

스레드 풀을 입력하는 방법에는 여러가지가 있습니다 통해

  • 는 태스크 라이브러리 (프레임 워크 4.0)
  • 비동기 대표
  • 을 통해 ThreadPool.QueueUserWorkItem
  • 를 호출하여 병렬
  • Via BackgroundWorker

2) 많은 사용자 스레드를 생성하면 안됩니다.

내가 읽기를 제안 : 조 Albahari의 우수한 Threading in C#

관련 문제