안녕하세요. 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 개의 작업이 실행 대기 중이라는 것입니다. 그렇다면 실행중인/실행 가능한 작업의 수를 어떻게 결정합니까?
Task.Factory는 대기열의 모든 작업을 즉시 또는 스케줄러가 사용 가능한 스레드를 찾을 때 실행합니다. 또한 StartNew 메서드를 사용할 때 취소 토큰을 전달해야 GC로 인해 작업이 예기치 않게 종료되는 것을 방지 할 수 있습니다. 내가 어떻게 실행/실행 가능한 작업 tho 번호를 결정하는지 모르겠습니다. –
또한 언급 잊어 버렸습니다, 작업 풀은 아무것도 잠그지 않을 것입니다, 그 이유는 작업 스케줄러입니다. –
현재 실행중인 작업 수 또는 완료되지 않은 작업이 있는지 알고 싶습니까? – Linky