작업과 스레드의 차이점
에서 사용할 수 있는 클래스는 두 가지입니다.NET:Task그리고.Thread.
- 그 수업들 사이의 차이점은 무엇입니까?
- 언제 사용하는 것이 더 좋습니까?
Thread위에Task(그리고 그 반대)?
Thread는 하위 수준 개념입니다. 스레드를 직접 시작하는 경우 스레드 풀 등에서 실행하는 것이 아니라 별도의 스레드가 될 것임을 알 수 있습니다.
Task하지만 단순히 "코드를 어디서 실행할 것인가"에 대한 추상화 이상의 것입니다. 실제로는 "미래의 결과에 대한 약속"일 뿐입니다.예를 들어 다음과 같습니다.
Task.Delay실제 CPU 시간이 필요하지 않습니다. 나중에 꺼지도록 타이머를 설정하는 것과 같습니다.- 반환된 작업
WebClient.DownloadStringTaskAsync로컬에서 CPU 시간이 많이 걸리지 않습니다. 대부분의 시간을 네트워크 대기 시간 또는 원격 작업(웹 서버)에 할애할 가능성이 높은 결과를 나타냅니다. - 반환된 작업
Task.Run()실제로는 "이 코드를 개별적으로 실행하기 바란다"고 말하는 것입니다. 코드가 실행되는 정확한 스레드는 여러 요인에 따라 달라집니다.
참고:Task<T>추상화는 C# 5의 비동기 지원에 중추적인 역할을 합니다.
일반적으로, 저는 당신이 할 수 있는 모든 곳에서 더 높은 수준의 추상화를 사용할 것을 권장합니다: 현대의 C# 코드에서 당신은 당신 자신의 스레드를 명시적으로 시작할 필요가 거의 없습니다.
일반적으로 작업이 스레드보다 상위 수준의 개념이라고 들으실 수 있습니다.그리고 이것이 이 문구의 의미입니다.
Abort/ThreadAborted를 사용할 수 없습니다.예외, 정기적으로 테스트하는 "비즈니스 코드"에서 취소 이벤트를 지원해야 합니다.
token.IsCancellationRequestedflag(db에 대한 연결과 같이 길거나 시간 제한이 없는 연결도 피합니다. 그렇지 않으면 이 플래그를 테스트할 기회가 없습니다.)비슷한 이유로Thread.Sleep(delay)호출을 다음으로 대체해야 합니다.Task.Delay(delay, token)call(지연을 방해할 수 있도록 토큰을 내부에 배치)합니다.스레드가 없습니다.
Suspend그리고.Resume메소드 및 태스크 기능.작업 인스턴스도 재사용할 수 없습니다.그러나 두 가지 새로운 툴이 제공됩니다.
계속
// 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 );따라서 시스템 스레드는 작업에서 완전히 숨겨지지만, 여전히 작업의 코드는 구체적인 시스템 스레드에서 실행됩니다.시스템 스레드는 작업을 위한 리소스이며 물론 작업의 병렬 실행이라는 후드 아래에도 스레드 풀이 있습니다.스레드가 새 작업을 실행하는 방법에는 다양한 전략이 있을 수 있습니다.다른 공유 리소스 작업 스케줄러가 이 작업을 고려합니다.TaskScheduler가 해결하는 몇 가지 문제 1) 전환 비용을 최소화하는 동일한 스레드에서 작업과 그 연속성을 실행하는 것을 선호합니다(일명 인라인 실행) 2) 시작한 순서대로 작업을 실행하는 것을 선호합니다(예: PreferFairness 3) "작업에 대한 사전 지식"에 따라 비활성 스레드 간에 보다 효과적으로 작업을 분배합니다.'도둑질'이라고도 합니다.중요: 일반적으로 "비동기"는 "병렬"과 동일하지 않습니다.작업 스케줄러 옵션을 사용하여 비동기 작업을 하나의 스레드에서 동기적으로 실행하도록 설정할 수 있습니다.병렬 코드 실행을 표현하기 위해 태스크보다 높은 추상화를 사용할 수 있습니다. , , .
작업은 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
'source' 카테고리의 다른 글
| require를 통해 호출되는지 아니면 명령줄을 통해 직접 호출되는지 탐지 (0) | 2023.05.15 |
|---|---|
| fatal: 초기 EOF fatal: 인덱스 팩 실패 (0) | 2023.05.15 |
| Dispose()에서 obj = null(없음)을 설정할 수 있습니까? (0) | 2023.05.15 |
| 분기 전환 및 커밋하지 않고 변경 사항 무시 (0) | 2023.05.15 |
| WPF의 숫자 데이터 입력 (0) | 2023.05.15 |