[c#] 스레드 생성-Task.Factory.StartNew 대 new Thread ()

.Net 4의 새로운 스레딩 및 병렬 라이브러리에 대해 배우고 있습니다.

과거에는 다음과 같이 새 스레드를 만들었습니다 (예제).

DataInThread = new Thread(new ThreadStart(ThreadProcedure));
DataInThread.IsBackground = true;
DataInThread.Start();

이제 할 수 있습니다.

Task t = Task.Factory.StartNew(() =>
{
   ThreadProcedure();
});

차이점이 있다면 무엇입니까?

감사



답변

큰 차이가 있습니다. 작업은 ThreadPool에서 예약되며 적절한 경우 동기식으로 실행될 수도 있습니다.

오래 실행되는 백그라운드 작업이있는 경우 올바른 작업 옵션을 사용하여이를 지정해야합니다.

더 최적화되어 있으므로 명시 적 스레드 처리보다 Task Parallel Library를 선호해야합니다. 또한 Continuation과 같은 더 많은 기능이 있습니다.


답변

이 태스크는 태스크 API의 모든 장점을 제공합니다.

  • 연속 추가 ( Task.ContinueWith)
  • 여러 작업이 완료되기를 기다리는 중 (모두 또는 일부)
  • 작업에서 오류를 캡처하고 나중에 조사
  • 취소 캡처 (시작할 취소 지정 가능)
  • 잠재적으로 반환 값이 있음
  • C # 5에서 await 사용
  • 스케줄링에 대한 더 나은 제어 (장시간 실행되는 경우, 작업을 생성 할 때 그렇게하여 작업 스케줄러가이를 고려할 수 있도록하십시오)

두 경우 모두 메서드 그룹 변환을 사용하여 코드를 약간 더 간단하게 만들 수 있습니다.

DataInThread = new Thread(ThreadProcedure);
// Or...
Task t = Task.Factory.StartNew(ThreadProcedure);


답변

첫 번째 경우에는 단순히 새 스레드를 시작하고 두 번째 경우에는 스레드 풀에 입력합니다.

스레드 풀 작업은 공유 및 재활용 스레드입니다. 새 스레드를 생성해야 할 때마다 몇 밀리 초가 손실되는 것을 방지 할 수 있습니다.

스레드 풀에 들어가는 방법에는 여러 가지가 있습니다.

  • TPL (Task Parallel Library)을 사용하여
  • ThreadPool.QueueUserWorkItem 을 호출하여
  • 대리자에서 BeginInvoke 를 호출 하여
  • BackgroundWorker 를 사용할 때

답변

첫 번째 코드 블록은 CLR에게 백그라운드로 실행될 수있는 스레드 (예 : T)를 만들도록 지시합니다 (T를 예약 할 때 스레드 풀 스레드 사용). 간단히 말해서 CLR에게 무언가를 수행 할 스레드를 생성하도록 명시 적으로 요청하고 시작할 스레드에서 Start () 메서드를 호출합니다.

두 번째 코드 블록은 동일하지만 태스크 팩토리 구현에서 StartNew 메서드를 통해 스레드 (백그라운드-다시 스레드 풀에서 실행 됨) 및 시작 스레드를 만드는 책임을 위임 (암시 적으로 전달)합니다.

이것은 주어진 코드 블록 간의 빠른 차이입니다. 그래도 Google을 검색하거나 동료 기여자의 다른 답변을 볼 수있는 세부적인 차이는 거의 없습니다.


답변