작업 생성자의 취소 토큰 : 왜?
특정 System.Threading.Tasks.Task
생성자 CancellationToken
는 매개 변수로 사용합니다.
CancellationTokenSource source = new CancellationTokenSource();
Task t = new Task (/* method */, source.Token);
이것에 대해 나를 당황스럽게하는 것은 메소드 본문 내부 에서 전달 된 토큰을 실제로 얻을 수있는 방법 이 없다는 것 입니다 (예 :) Task.CurrentTask.CancellationToken
. 토큰은 상태 객체와 같은 다른 메커니즘을 통해 제공되거나 람다에서 캡처되어야합니다.
그렇다면 생성자에서 취소 토큰을 제공하는 목적은 무엇입니까?
이 토큰을 작업 생성자에 전달하면이 작업과 토큰이 연결됩니다.
여기에는 두 가지 주요 이점이 있습니다.
- 작업이 실행되기 전에 토큰이 취소를 요청한 경우 작업이 실행되지 않습니다. 로 전환하는 대신
Running
즉시로 전환됩니다Canceled
. 이렇게하면 어쨌든 실행하는 동안 작업이 취소 될 경우 작업 실행 비용을 피할 수 있습니다.- 작업 본문에서 취소 토큰도 모니터링하고
OperationCanceledException
해당 토큰을 포함하는 토큰을 던지면 (이것이 무엇인지ThrowIfCancellationRequested
) 작업에서이 토큰을 발견하면의 토큰이 작업 토큰과 일치OperationCanceledException
하는지 확인합니다OperationCanceledException
. 이 경우 해당 예외는 협력 취소에 대한 승인으로 간주되며 작업은 오류 상태가 아닌 취소 상태로 전환됩니다.
생성자는 내부적으로 취소 처리를 위해 토큰을 사용합니다. 코드가 토큰에 액세스하기를 원하는 경우 토큰을 자신에게 전달해야합니다. CodePlex에서 Microsoft .NET을 사용한 병렬 프로그래밍 책을 읽는 것이 좋습니다 .
책에서 CTS 사용 예 :
CancellationTokenSource cts = new CancellationTokenSource();
CancellationToken token = cts.Token;
Task myTask = Task.Factory.StartNew(() =>
{
for (...)
{
token.ThrowIfCancellationRequested();
// Body of for loop.
}
}, token);
// ... elsewhere ...
cts.Cancel();
많은 사람들이 생각하는 것처럼 취소는 단순한 경우가 아닙니다. msdn에 대한이 블로그 게시물에서 미묘한 부분에 대해 설명합니다.
예를 들면 다음과 같습니다.
Parallel Extensions 및 다른 시스템의 특정 상황에서는 사용자가 명시 적으로 취소하지 않은 이유로 차단 된 방법을 깨워 야합니다. 예를 들어, 컬렉션이 비어있어 하나의 스레드가 blockingCollection.Take ()에서 차단되고 다른 스레드가 후속 적으로 blockingCollection.CompleteAdding ()을 호출하면 첫 번째 호출이 일어나 잘못된 사용을 나타내는 InvalidOperationException을 발생시킵니다.
http://blogs.msdn.com/b/pfxteam/archive/2009/06/22/9791840.aspx
참고 URL : https://stackoverflow.com/questions/3712939/cancellation-token-in-task-constructor-why
'Programing' 카테고리의 다른 글
왜 정적 클래스를 상속받을 수 없습니까? (0) | 2020.04.29 |
---|---|
서명 버전의 차이점-AndroidStudio에서 서명 된 APK를 생성하는 동안 V1 (Jar Signature) 및 V2 (Full APK Signature)? (0) | 2020.04.29 |
모범 사례 : 소프트웨어 버전 관리 (0) | 2020.04.29 |
커밋되지 않은 읽기 격리 수준을 사용해야하는 이유는 무엇입니까? (0) | 2020.04.29 |
봄 @ 자동 유선 사용법 (0) | 2020.04.29 |