작업과 스레드의 차이점
에서 사용할 수 있는 클래스는 두 가지입니다.NET:Task
그리고.Thread
.
- 그 수업들 사이의 차이점은 무엇입니까?
- 언제 사용하는 것이 더 좋습니까?
Thread
위에Task
(그리고 그 반대)?
Thread
는 하위 수준 개념입니다. 스레드를 직접 시작하는 경우 스레드 풀 등에서 실행하는 것이 아니라 별도의 스레드가 될 것임을 알 수 있습니다.
Task
하지만 단순히 "코드를 어디서 실행할 것인가"에 대한 추상화 이상의 것입니다. 실제로는 "미래의 결과에 대한 약속"일 뿐입니다.예를 들어 다음과 같습니다.
Task.Delay
실제 CPU 시간이 필요하지 않습니다. 나중에 꺼지도록 타이머를 설정하는 것과 같습니다.- 반환된 작업
WebClient.DownloadStringTaskAsync
로컬에서 CPU 시간이 많이 걸리지 않습니다. 대부분의 시간을 네트워크 대기 시간 또는 원격 작업(웹 서버)에 할애할 가능성이 높은 결과를 나타냅니다. - 반환된 작업
Task.Run()
실제로는 "이 코드를 개별적으로 실행하기 바란다"고 말하는 것입니다. 코드가 실행되는 정확한 스레드는 여러 요인에 따라 달라집니다.
참고:Task<T>
추상화는 C# 5의 비동기 지원에 중추적인 역할을 합니다.
일반적으로, 저는 당신이 할 수 있는 모든 곳에서 더 높은 수준의 추상화를 사용할 것을 권장합니다: 현대의 C# 코드에서 당신은 당신 자신의 스레드를 명시적으로 시작할 필요가 거의 없습니다.
일반적으로 작업이 스레드보다 상위 수준의 개념이라고 들으실 수 있습니다.그리고 이것이 이 문구의 의미입니다.
Abort/ThreadAborted를 사용할 수 없습니다.예외, 정기적으로 테스트하는 "비즈니스 코드"에서 취소 이벤트를 지원해야 합니다.
token.IsCancellationRequested
flag(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.RequestAsync
UI 스레드를 차단하지 않습니다. 중요: 후드아래.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 |