2013-07-03 2 views
0

C# .Net4.0에서 스레딩 프로그램을 작성 중이며 문제가 발생했습니다.모든 스레드 완료 처리 대기 각 WebRequest

스레드 풀과 콜백을 사용하고 있습니다. 아래는 Main()의 코드입니다.

string[] urls = { url1, url2, url3, url4 }; 
callBack = new WaitCallback(PooledFunc); 
for (int i = 0; i < urls.Length; i++) 
    ThreadPool.QueueUserWorkItem(callBack, urls[i]); 

나는 또한 내가 거기에 몇 가지 테스트 인쇄를 넣어 URL을

static void PooledFunc(object url) 
{ 
    HttpWebRequest request = HttpWebRequest.Create(url) as HttpWebRequest; 

    // Get the response. 
    HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
    Stream Answer = response.GetResponseStream(); 

    // Display the status. 
    Console.WriteLine(response.Headers); 
    StreamReader _Answer = new StreamReader(Answer); 

    string content = _Answer.ReadToEnd(); 
    Console.WriteLine(content); 
} 

에서 응답을 얻을 것이다 기능이 있고, 위의 코드로, 프로그램이 보인다는 모든 스레드를 시작 싶지만 종료 모두가 통과하기 전에, 그리고 매번 다른 것이 었습니다.

for 루프 뒤에 Console.ReadLine();을 넣으면 모든 스레드가 완료 될 때까지 기다리는 것처럼 보입니다.

질문 : 모든 스레드가 완료 될 때까지 기다릴 수있는 방법이 있습니까? Console.ReadLine();을 사용하지 않고 다음 단계로 진행 하시겠습니까?

답변

2

대신 ThreadPool.QueueUserWorkItem를 사용하여, 당신은 같은 일을 수행 할 Parallel.ForEach을 사용할 수있는 모든 항목이 처리 될 때까지

string[] urls = { url1, url2, url3, url4 }; 
Parallel.ForEach(urls, url => PooledFunc(url)); 

Parallel.ForEach

는 반환하지 않습니다.

static void PooledFunc(string url) // Can keep this strongly typed 
{ 
    HttpWebRequest request = HttpWebRequest.Create(url) as HttpWebRequest; 
+0

리드 - 감사합니다 @

이것은 또한 당신이 PooledFunc 선언 좋네요을 유지할 수 있습니다! 이것은 완벽하게 작동합니다! 다른 질문을 던지면 더 많은 스레드 (또는 병렬)를 여는 데 상당한 단점이 있습니까? 중첩 된/recursinve처럼? 예를 들어, 그 (4) url 아래에서 다중 URL 열기 – sora0419

+0

@ sora0419 각 스레드에 오버 헤드가 있습니다. 스레드가 너무 많으면 오버 헤드를 추가하고 이익을 얻을 수 없습니다. "병렬"및 이와 유사한 도구 파티션을 통해 균형을 조정할 수 있습니다. –