728x90
Task, Task<TResult> 클래스는 cancellation tokens을 사용하여 취소를 지원합니다. 작업 클래스에서 취소하려면 취소할 수 있는 작업을 나타내는 사용자 대리자와 취소를 요청한 코드 간의 협조가 필요합니다. 성공적으로 취소하려면 CancellationTokenSource.Cancel 메서드를 호출하는 요청 코드와 적절한 시간에 작업을 종료하는 사용자 대리자가 필요합니다. 다음 방법 중 하나를 사용하여 작업을 종료할 수 있습니다.
- 대리자에서 반환합니다. 많은 시나리오에서 이 옵션은 충분합니다. 그러나 이러한 방식으로 취소된 작업 인스턴스는 TaskStatus.Canceled 상태가 아닌 TaskStatus.RanToCompletion 상태로 전환됩니다.
- OperationCanceledException을 발생시키고 취소가 요청된 토큰을 전달합니다. 선호하는 수행 방법은 ThrowIfCancellationRequestd 메서드를 사용하는 것입니다. 이러한 방식으로 취소된 작업은 취소됨 상태로 전환되며 호출 코드는 작업이 취소 요청에 응답했는지 확인하는데 사용할 수 있습니다.
using System;
using System.Threading;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
var tokenSource2 = new CancellationTokenSource();
CancellationToken ct = tokenSource2.Token;
var task = Task.Run(() =>
{
// Were we already canceled?
ct.ThrowIfCancellationRequested();
bool moreToDo = true;
while (moreToDo)
{
// Poll on this property if you have to do
// other cleanup before throwing.
if (ct.IsCancellationRequested)
{
// Clean up here, then...
ct.ThrowIfCancellationRequested();
}
}
}, tokenSource2.Token); // Pass same token to Task.Run.
tokenSource2.Cancel();
// Just continue on this thread, or await with try-catch:
try
{
await task;
}
catch (OperationCanceledException e)
{
Console.WriteLine($"{nameof(OperationCanceledException)} thrown with message: {e.Message}");
}
finally
{
tokenSource2.Dispose();
}
Console.ReadKey();
}
}
[출처]
https://learn.microsoft.com/en-us/dotnet/standard/parallel-programming/task-cancellation
728x90
'C#' 카테고리의 다른 글
[암호화] 용어 정리 (0) | 2023.01.23 |
---|---|
Command Line Argument (0) | 2023.01.23 |
Task Parallel Library에 대한 예외 처리2 (0) | 2023.01.23 |
Task Parallel Library에 대한 예외 처리1 - Child Task에 대한 예외 처리 (0) | 2023.01.23 |
[DevExpress] AccordionControl Group Header에 Check Box 넣기 (0) | 2023.01.23 |