2014-07-17 6 views
1

나는 스레드로 작업하는 초보자입니다. 나는 한 블록의 코드를보고있다. 파트 목록의 각 파트에 대해 개별 스레드에서 메서드를 실행해야한다고 생각합니다. 코드 (a)는 다음과 같습니다.Task.Factory.StartNew에 관한 기본 문제

Task.Factory.StartNew(()=> 
     foreach (string part in partlist) 
     { 
     DoLotsOfStuff(part); 
     } 
    ); 

저에게 그것은 모든 것을 단일 스레드로 실행하는 것처럼 보입니다. 개별 스레드에서 메소드를 실행해야한다면 코드가 이렇게 보이길 기대합니다. 코드 (b)는 다음과 같습니다.

foreach (string part in partlist) 
    { 
     Task.Factory.StartNew(()=> DoLotsOfStuff(part)); 
    } 

개별 스레드에서 메소드를 실행하는 코드 블록은 어느 것입니까? 그리고/또는 작업을 수행하기 위해 어떤 변경을해야합니까?

+1

당신은 정확합니다. 첫 번째 코드 블록은 모든 스레드를 단일 스레드로 실행합니다. 두 번째는 별도의 스레드에서 DoLotsOfStuff()의 각 반복을 실행합니다. – Kevin

+2

BTW : 각 파트에 대해 다른 Task를 만드는 대신 Parallel.ForEach를 사용하는 것이 좋습니다 (partList가 큰 경우). – EZI

답변

1

StartNew()의 작동 방식을 이해했습니다.

docs ... StartNew()은 작업을 만들고 해당 작업 내에서 작업을 실행하는 작업을 수행합니다.

이것은 비동기 적으로 발생하므로 호출 코드가 계속 실행됩니다. 그러나 StartNew()에 전달하는 작업은 동 기적으로 실행되므로 첫 번째 코드 블록에서 전체 루프가 동일한 스레드 내에서 실행됩니다. 달성하려는 모든 것이 루프를 주 코드와 비동기 적으로 실행하도록하려는 경우 원하는 동작 일 수 있습니다. 루프 내부에서 수행 된 작업을 멀티 스레딩하여 성능을 향상시키려는 경우 두 번째 코드 블록을 원하는대로 사용해야합니다.

편집 :

Parallel.ForEach(partlist, DoLotsOfWork); 

Parallel.Foreach

는 점에서 더 효율적입니다 EZI가 Parallel.ForeEach 여기에 더있을 수 있습니다 언급
으로 ... 코드 ... 같을 것이다는 것이다 일괄 처리가 아닌 스레드를 만들 목록의 각 항목에 대해서도 마찬가지이지만, StartNew과 같이 비동기 적으로 실행되지는 않습니다.

당신이 Parrallel.Foreach은 항상이 작업을 수행 할 수 있습니다 비동기 적으로 실행하려면

...

Task.Factory.StartNew(() => Parallel.ForEach(partlist, DoLotsOfWork));