2010-02-25 8 views

답변

36

아마도 Parallel Extensions와 일반 스레드 간의 가장 중요한 차이점은 제어 흐름입니다.

new Thread(...) 또는 ThreadPool.QueueUserWorkItem을 사용하여 생성 된 스레드는 완전히 확정되지 않은 시점에서 종료됩니다.

ThreadPool.QueueUserWorkItem(() => 
    { 
     Thread.Sleep(1000); 
     Console.WriteLine("Work Finished"); 
    }); 
Console.WriteLine("Item Queued"); 

텍스트 Item Queued 바로 표시되며, Work Finished 약 1 초 지연 후 인쇄됩니다 : 당신은이 코드를 작성합니다. 병렬 확장을 사용하여 비슷한 작성하는 경우 반면에

는 : 아무것도, "테스트"의 다음 회전을 발생하기 전에이 사건에서 볼 수있는 것들

Parallel.For(0, 10, i => 
    { 
     Thread.Sleep(1000); 
     Console.WriteLine("Test {0}", i); 
    }); 
Console.WriteLine("Finished"); 

는 1 초 지연이다 임의의 순서로 메시지를 보내고 다음에 텍스트 Finished.

즉, 병렬로 작업을 실행해도 실제로 프로그램 흐름이 변경되지 않습니다. 다른 스레드에서 다른 작업을 실행하여 프로그램의 전체 처리량을 향상시키기 위해 여러 CPU 코어에서 실행될 수 있지만 일반적인 프로그래머에 관한 한 이러한 작업은 실제로 백그라운드에서 실행되지 않습니다 "그들은 실로있을 것입니다. 프로그램 구조를 변경할 필요가 없으며 작업이 완료 될 때 알림을 받기 위해 특별한 조치를 취할 필요가 없습니다. 내부에서 병렬 블록이 발생하는 것을 제어 할 수는 없지만 모든 병렬 작업이 완료 될 때까지 블록이 제어를 반환하지 않는다는 것을 알고 있습니다. 병렬 확장이 훌륭한 있지만

, 그것은 당신이 실제로 필요는 스케줄러를 구현하거나하기 위해 작업자 스레드에 위임로, 백그라운드에서 작업을 실행하면 아무 소용이있다 무엇이든지 그 PX를 언급 곰 UI를 반응 적으로 유지하십시오. 여전히 스레드 또는 비동기 구성 요소를 사용해야합니다.

+0

또한 작업을 기다릴 때 스레드와 달리 모든 하위 작업을 기다립니다. 오류 처리는 작업과 스레드가 훨씬 좋습니다. –

4

는 여기에 내가 잠시 다시이 주제에 대한 감시 좋은는 Channel9입니다. 대부분의 작업에 병렬 처리 확장을 사용하는 것이 더 쉽습니다.

+0

안녕하세요, 아담,이 링크는 나를 위해 작동하지 않습니다. 페이지를 찾을 수 없음, 다른 유용한 링크 –

-2

병렬 처리 자동 생성 스레드에 대한 그냥 멋진 인터페이스 :

1

병렬 프레임 워크는 .NET 스레딩 모델을 사용합니다.이 모델은 Windows 스레딩 모델을 기반으로합니다. 그러나 병렬 라이브러리의 효율성을 높이기 위해 일반적인 프레임 워크에서 많은 최적화 작업이 수행되었습니다.

This blog 추가 세부 사항이 있습니다.