2013-08-01 3 views
1

안녕하세요. Task.Factory.StartNew에 묶여 있습니다. 누군가가 제안한 아이디어를 얻은 것처럼 다음 코드를 작성합니다.Task.Factory.StartNew - 풀에 대해 혼동했습니다.

bool exitLoop = false;     
while (!exitLoop) 
{ 
    exitLoop = true; 
    var messages = Queue.GetMessages(20); 
    foreach (var message in messages)      
    { 
     exitLoop = false; 
     Task.Factory.StartNew(() => 
        { 
         DeliverMessage(message); 
        }); 
    } 
} 

이론적으로 이는 큐에있는 모든 메시지에 대해 작업을 생성하려고 시도 할 때 한 번에 20 개의 메시지를 큐에 저장합니다. 따라서 대기열에 1000 개의 메시지가있는 경우 즉각적으로 25 개의 작업이 있으며 모든 메시지를 처리 ​​할 수 ​​있습니다. 이전에 내가 이것을 이해했다고 생각했지만 StartNew가 항목이 없어지면 차단할 것이라고 생각했습니다. 예전에는 ~ 25 일 것입니다.하지만 이것이 주어지면 .net 4.5입니다. 수영장이 꽤 높습니다. 나를 괴롭히는 이유는 새로운 작업으로 풀을 가득 채우고 차단하기 시작한다고 가정했기 때문입니다. 즉, 지금은 1000 개의 작업이 실행 중입니다. 그래서 풀 한도가 이제는 거의 한계가 없는데 왜 내가 1000 개의 작업을 볼 수 없습니까?

[편집] 좋아, 그럼 내가보고있는 것은 1000 개의 작업이 실행 대기 중이라는 것입니다. 그렇다면 실행중인/실행 가능한 작업의 수를 어떻게 결정합니까?

+0

Task.Factory는 대기열의 모든 작업을 즉시 또는 스케줄러가 사용 가능한 스레드를 찾을 때 실행합니다. 또한 StartNew 메서드를 사용할 때 취소 토큰을 전달해야 GC로 인해 작업이 예기치 않게 종료되는 것을 방지 할 수 있습니다. 내가 어떻게 실행/실행 가능한 작업 tho 번호를 결정하는지 모르겠습니다. –

+0

또한 언급 잊어 버렸습니다, 작업 풀은 아무것도 잠그지 않을 것입니다, 그 이유는 작업 스케줄러입니다. –

+0

현재 실행중인 작업 수 또는 완료되지 않은 작업이 있는지 알고 싶습니까? – Linky

답변

0

귀하의 게시물 이후 꽤 오래되었음을 알고 있지만, 귀하의 구체적인 도전에 직면 한 사람에게 도움이되기를 바랍니다. 마지막 의견은 'DeliverMessage'메소드가 HTTP 요청을 작성한다고 설명했습니다.

요청을하기 위해 'WebClient'개체 (예 :)를 사용하는 경우 ServicePointManager.DefaultConnectionLimit 속성으로 바인딩됩니다. 이는 호스트에 대한 최대 2 개의 동시 연결을 생성 함을 의미합니다. 1,000 개의 병렬 작업을 작성한 경우 1,000 개의 모든 작업을이 두 연결로 처리해야합니다.

응용 프로그램의 처리량과 웹 서버의로드 사이에 적절한 균형을 찾으려면이 설정에 대해 다른 값으로 재생해야합니다.

관련 문제