2016-11-29 5 views
2

필자는 병렬로 실행할 작업 목록을 제한된 방식으로 가지고 있는데, 관리하지 않고도 배치 작업과 거의 같습니다. 내 접근 방식은 Parallel.ForEach 및 ParallelOptions의 MaxDegreeOfParallelism 속성을 사용하는 것이 었습니다. 나는 값을 설정하는 것에 상관없이 모든 작업이 동시에 시작된다는 것을 알았습니다. 이것은 바람직하지 않은 동작입니다. 나는 동시에 실행되는 작업의 양이 속성과 같기를 바란다. 내가 그림MaxDegreeOfParallelism 작업 목록에 적용되지 않습니까?

class Program 
{ 
    static void Main(string[] args) 
    { 
     var numbers = Enumerable.Range(1, 5); 
     var tasks = new List<Task>(); 

     foreach (int number in numbers) 
     { 
      tasks.Add(new Task(() => {Console.WriteLine("Starting thread {0} at time {1}. Starting delay...", Thread.CurrentThread.ManagedThreadId, DateTime.Now); 
      Thread.Sleep(1000); 
      Console.WriteLine("{0} is done at {1}.", Thread.CurrentThread.ManagedThreadId, DateTime.Now);})); 
     } 

     Parallel.ForEach(tasks, new ParallelOptions() { MaxDegreeOfParallelism = 2 }, t => 
     { 
      t.Start(); 
     }); 

     Task.WaitAll(tasks.ToArray()); 
    } 
} 

에 대한 간단한 예를 쓴 다음 출력입니다 : Console Output

내 접근하거나 이해가 잘못된는?

+0

설명서 및 기타 몇 가지 질문을 읽은 후에 - 이해를 공유 했으므로 작동해야합니다. 나는 누군가가 대답을 알기를 바랍니다, 이것은 잠시 나를 괴롭힐 것입니다. – zmbq

+0

안녕 Seapoe, MaxDegreeOfParallelism 동시에 실행할 수있는 스레드 수에 영향을줍니다. 각 스레드가 시작될 때를 결정하지는 않습니다. – Riv

답변

4

나는 약간의 혼란을 느낀다. 평행선의 최대 등급은 병렬 ForEach에서 사용되는 작업의 양에 적용되지만 새로운 작업을 생성하는 내부에서는 ParallelOptions에 의해 제어되지 않지만 TaskScheduler .

동시 작업 수를 제한하려면 사용자 지정 TaskScheduler를 만들고 실행중인 작업 수를 제한해야합니다.

Here 예를 찾을 수 있습니다.

+0

흥미 롭습니다. 그래서 내 예제에서 새로운 작업의 생성을 제거하고 병렬 루프 내부에 실행 코드를 배치하면 내가 원하는 것을 얻을 수 있을까요? – Seapoe

+0

예. 그렇습니다. – Gusman

+0

그래, 효과가! 고마워요! 커스텀 스케줄러에 대해서도 살펴볼 것입니다. – Seapoe