2012-05-23 1 views
5

안녕하세요 _noOfThreads은 한 번에 정의 된 작업으로 실행됩니다. 그래서 나는 계속연산자를 사용하여 작업을 계속하고 있으며 루프의 끝에는 Tasks.WaitAll이 있습니다. 이것은 코드 단편입니다.Task.WaitAll은 하위 작업을 기다리지 않습니까?

for (int index = 0; index < count; index++) 
{ 

       if (index < _noOfThreads) 
        tasks[index] = Task.Factory.StartNew(somedelegate); 
       else 
        tasks[index % _noOfThreads].ContinueWith(task => { foo.bar(); }, 
          TaskContinuationOptions.AttachedToParent); 
} 
    Task.WaitAll(tasks); 

그러나 하위 작업이 완료 될 때까지 기다리지 않습니다. 상위 작업이 완료 되 자마자 Task.WaitAll 다음 줄이 실행됩니다. 하위 작업도 대기하도록이 코드를 어떻게 변경합니까?

Tasks[] tasks = new Task[ _noOfThreads]; 
가 될 코드를 변경

:

+0

[Task.Continue가 예상했던대로 작동하지 않음] (http://stackoverflow.com/questions/6997480/task-continuewith-not-working-how-i-expected) – mellamokb

+0

사이드 노트에서 당신이 여기서하는 일은 작업 스케줄링을 결정하는 것입니다. 일정을 사용자 지정하려는 경우 [TaskScheduler] (http://msdn.microsoft.com/en-us/library/system.threading.tasks.taskscheduler.aspx)에서 파생되는 것을 볼 수 있습니다. 즉, 기본 스케줄러는 이미 많은 수의 작업이 대기중인 경우 스레드로 시스템에 과부하가 걸리지 않도록 매우 잘 수행합니다. –

+0

@ Dan : 그건 내 관심사가 아닙니다. 나는 이것을 TaskScheduler에게주고 싶지 않다. 변수가 있고 그 변수만큼만 Tasks를 시작하고 싶습니다. 즉, 세마포어 (semaphore)와 같은 것을 시뮬레이트하기를 원합니다. 세마포어 (semaphore)는 쓰레드의 수를 정의하고 그 수의 쓰레드 만이 특정 시간에 그 코드를 입력 할 수 있습니다. –

답변

8

난 당신이 귀하의 작업을 할당 생각

Tasks[] tasks = new Task[count]; 

for (int index = 0; index < count; index++) 
{ 

    if (index < _noOfThreads) 
     tasks[index] = Task.Factory.StartNew(somedelegate); 
    else 
     tasks[index] = tasks[index % _noOfThreads].ContinueWith(task => { foo.bar(); }, 
          TaskContinuationOptions.AttachedToParent); 
} 
Task.WaitAll(tasks); 

이 그것을 시도 줘! 행운을 빌어 요.

3

원래 작업 만 기다리고 있습니다. 모든 계속 작업이 완료 될 때까지 기다리려면 계속 작업에서 WaitAll으로 전화해야합니다. 이 작업을 수행하는 간단한 방법은 단지 마지막 연속성을 기다리고되도록 원래의 변수에 다시 각각의 연속 작업을 할당하는 것입니다 :

else 
    tasks[index % _noOfThreads] = 
     tasks[index % _noOfThreads].ContinueWith(task => { foo.bar(); }, 
         TaskContinuationOptions.AttachedToParent); 

this related question를 참조하십시오.

관련 문제