source

작업과 스레드의 차이점

manysource 2023. 5. 15. 22:21

작업과 스레드의 차이점

에서 사용할 수 있는 클래스는 두 가지입니다.NET:Task그리고.Thread.

  • 그 수업들 사이의 차이점은 무엇입니까?
  • 언제 사용하는 것이 더 좋습니까?Thread위에Task(그리고 그 반대)?

Thread는 하위 수준 개념입니다. 스레드를 직접 시작하는 경우 스레드 풀 등에서 실행하는 것이 아니라 별도의 스레드가 될 것임을 알 있습니다.

Task하지만 단순히 "코드를 어디서 실행할 것인가"에 대한 추상화 이상의 것입니다. 실제로는 "미래의 결과에 대한 약속"일 뿐입니다.예를 들어 다음과 같습니다.

  • Task.Delay실제 CPU 시간이 필요하지 않습니다. 나중에 꺼지도록 타이머를 설정하는 것과 같습니다.
  • 반환된 작업WebClient.DownloadStringTaskAsync로컬에서 CPU 시간이 많이 걸리지 않습니다. 대부분의 시간을 네트워크 대기 시간 또는 원격 작업(웹 서버)에 할애할 가능성이 높은 결과를 나타냅니다.
  • 반환된 작업Task.Run()실제로는 "이 코드를 개별적으로 실행하기 바란다"고 말하는 것입니다. 코드가 실행되는 정확한 스레드는 여러 요인에 따라 달라집니다.

참고:Task<T>추상화는 C# 5의 비동기 지원에 중추적인 역할을 합니다.

일반적으로, 저는 당신이 할 수 있는 모든 곳에서 더 높은 수준의 추상화를 사용할 것을 권장합니다: 현대의 C# 코드에서 당신은 당신 자신의 스레드를 명시적으로 시작할 필요가 거의 없습니다.

일반적으로 작업이 스레드보다 상위 수준의 개념이라고 들으실 수 있습니다.그리고 이것이 이 문구의 의미입니다.

  1. Abort/ThreadAborted를 사용할 수 없습니다.예외, 정기적으로 테스트하는 "비즈니스 코드"에서 취소 이벤트를 지원해야 합니다.token.IsCancellationRequestedflag(db에 대한 연결과 같이 길거나 시간 제한이 없는 연결도 피합니다. 그렇지 않으면 이 플래그를 테스트할 기회가 없습니다.)비슷한 이유로Thread.Sleep(delay)호출을 다음으로 대체해야 합니다.Task.Delay(delay, token)call(지연을 방해할 수 있도록 토큰을 내부에 배치)합니다.

  2. 스레드가 없습니다.Suspend그리고.Resume메소드 및 태스크 기능.작업 인스턴스도 재사용할 없습니다.

  3. 그러나 두 가지 새로운 툴이 제공됩니다.

    계속

    // continuation with ContinueWhenAll - execute the delegate, when ALL
    // tasks[] had been finished; other option is ContinueWhenAny
    
    Task.Factory.ContinueWhenAll( 
       tasks,
       () => {
           int answer = tasks[0].Result + tasks[1].Result;
           Console.WriteLine("The answer is {0}", answer);
       }
    );
    

    중첩된/하위 작업

    //StartNew - starts task immediately, parent ends whith child
    var parent = Task.Factory.StartNew
    (() => {
              var child = Task.Factory.StartNew(() =>
             {
             //...
             });
          },  
          TaskCreationOptions.AttachedToParent
    );
    
  4. 따라서 시스템 스레드는 작업에서 완전히 숨겨지지만, 여전히 작업의 코드는 구체적인 시스템 스레드에서 실행됩니다.시스템 스레드는 작업을 위한 리소스이며 물론 작업의 병렬 실행이라는 후드 아래에도 스레드 풀이 있습니다.스레드가 새 작업을 실행하는 방법에는 다양한 전략이 있을 수 있습니다.다른 공유 리소스 작업 스케줄러가 이 작업을 고려합니다.TaskScheduler가 해결하는 몇 가지 문제 1) 전환 비용을 최소화하는 동일한 스레드에서 작업과 그 연속성을 실행하는 것을 선호합니다(일명 인라인 실행) 2) 시작한 순서대로 작업을 실행하는 것을 선호합니다(예: PreferFairness 3) "작업에 대한 사전 지식"에 따라 비활성 스레드 간에 보다 효과적으로 작업을 분배합니다.'도둑질'이라고도 합니다.중요: 일반적으로 "비동기"는 "병렬"과 동일하지 않습니다.작업 스케줄러 옵션을 사용하여 비동기 작업을 하나의 스레드에서 동기적으로 실행하도록 설정할 수 있습니다.병렬 코드 실행을 표현하기 위해 태스크보다 높은 추상화를 사용할 수 있습니다. , , .

  5. 작업은 Promise Model(: Promise Model)이라고 하는 C# 비동기/대기 기능과 통합됩니다.requestButton.Clicked += async (o, e) => ProcessResponce(await client.RequestAsync(e.ResourceName));client.RequestAsyncUI 스레드를 차단하지 않습니다. 중요: 후드아래.Clicked대리자 호출은 절대적으로 정기적입니다(모든 스레드는 컴파일러에서 수행됨).

그것은 선택을 하기에 충분합니다.중단되는 경향이 있는 레거시 API를 호출하는 취소 기능(예: 타임아웃 없는 연결)을 지원해야 하는 경우 이 경우 스레드를 지원합니다.중단() 또는 다중 스레드 백그라운드 계산을 만들고 일시 중단/재개를 사용하여 스레드 간 전환을 최적화하려면 병렬 실행을 수동으로 관리해야 합니다. 스레드를 그대로 유지합니다.그렇지 않으면 작업 그룹을 쉽게 조작할 수 있고 언어에 통합되어 개발자의 생산성을 높일 수 있기 때문에 작업으로 이동합니다. - 작업 병렬 라이브러리(TPL)

클래스는 Windows에서 스레드를 만들고 조작하는 데 사용됩니다.

A은(는) 일부 비동기 작업을 나타내며 비동기 및 병렬로 작업을 실행하기 위한 API 집합인 작업 병렬 라이브러리의 일부입니다.

TPL 이전)에는 옛즉날(TPL 이에)▁the▁using▁in다에니▁t습▁that즉▁used것▁to)를 사용하는 것이었습니다.Thread클래스는 백그라운드에서 또는 병렬로 코드를 실행하는 표준 방법 중 하나였지만(더 나은 대안은 종종 를 사용하는 것이었습니다), 이것은 번거롭고 몇 가지 단점이 있었습니다. 특히 백그라운드에서 작업을 수행하기 위해 완전히 새로운 스레드를 생성해야 하는 성능 오버헤드였습니다.

오늘날 작업과 TPL을 사용하면 시스템 리소스를 훨씬 효율적으로 사용할 수 있는 추상화를 제공하므로 90%의 시간을 훨씬 더 효율적으로 해결할 수 있습니다.코드를 실행 중인 스레드를 명시적으로 제어하려는 몇 가지 시나리오가 있을 수 있지만, 일반적으로 비동기식으로 실행하려면 첫 번째 호출 포트가 TPL이어야 합니다.

언급URL : https://stackoverflow.com/questions/13429129/task-vs-thread-differences