使用return退出循环. In this case, the state of the task will be TaskStatus.RunToCompletion.
publicstaticvoidMain(string[] args){CancellationTokenSource cancelTokenSource =newCancellationTokenSource();CancellationToken token = cancelTokenSource.Token;Task task =newTask(()=>{for(int i =1; i <100; i++){if(token.IsCancellationRequested){
Console.WriteLine("Operation is canceled");return;}
Console.WriteLine($"Count is equal to '{i}'");//add some timeout to emulate real-life execution
Thread.Sleep(10);}}, token);
task.Start();// add some timeout to emulate real-life execution
Thread.Sleep(100);// cancel the parallel operation
cancelTokenSource.Cancel();// wait till the operation is completed
task.Wait();// check the operation status
Console.WriteLine($"Task Status is equal to '{ task.Status }'");// release resources
cancelTokenSource.Dispose();}
Output:
Count isequal to '1'
Count isequal to '2'
Count isequal to '3'
Count isequal to '4'
Count isequal to '5'
Operation iscanceled
Task Status isequal to 'RanToCompletion'
Example — Complete Task via ThrowIfCancellationRequested()
Throw OperationCanceledException exception via ThrowIfCancellationRequested() method call. In this case, the state of the task will be TaskStatus.Canceled.
The exception will be thrown only in case when Wait() or WaitAll() method is called for the task. Otherwise, no exception is thrown, just TaskStatus.Canceled is set.
publicstaticvoidMain(string[] args){CancellationTokenSource cancelTokenSource =newCancellationTokenSource();CancellationToken token = cancelTokenSource.Token;Task task =newTask(()=>{for(int i =1; i <100; i++){if(token.IsCancellationRequested)
token.ThrowIfCancellationRequested();
Console.WriteLine($"Count is equal to '{i}'");//add some timeout to emulate real-life execution
Thread.Sleep(10);}}, token);try{
task.Start();// add some timeout to emulate real-life execution
Thread.Sleep(100);// cancel the parallel operation
cancelTokenSource.Cancel();// wait till the operation is completed
task.Wait();}catch(AggregateException ae){foreach(Exception e in ae.InnerExceptions){if(e isTaskCanceledException)
Console.WriteLine("Operation is canceled");else
Console.WriteLine(e.Message);}}finally{// release resources
cancelTokenSource.Dispose();}// check the operation status
Console.WriteLine($"Task Status is equal to '{ task.Status }'");}
Output:
Count isequal to '1'
Count isequal to '2'
Count isequal to '3'
Count isequal to '4'
Count isequal to '5'
Operation iscanceled
Task Status isequal to 'Canceled'
Example — Register Operation Cancellation Handler
It registers an Action delegate that will be called when the CancellationToken is cancelled.
publicstaticvoidMain(string[] args){CancellationTokenSource cancelTokenSource =newCancellationTokenSource();CancellationToken token = cancelTokenSource.Token;Task task =newTask(()=>{int i =1;
token.Register(()=>{
Console.WriteLine("Operation is canceled");
i =100;
Console.WriteLine($"Count is equal to '{i}'");});for(; i <100; i++){
Console.WriteLine($"Count is equal to '{i}'");//add some timeout to emulate real-life execution
Thread.Sleep(10);}}, token);
task.Start();// add some timeout to emulate real-life execution
Thread.Sleep(100);// cancel the parallel operation
cancelTokenSource.Cancel();// wait till the operation is completed
task.Wait();// check the operation status
Console.WriteLine($"Task Status is equal to '{ task.Status }'");// release resources
cancelTokenSource.Dispose();}
Output:
Count isequal to '1'
Count isequal to '2'
Count isequal to '3'
Count isequal to '4'
Count isequal to '5'
Operation iscanceled
Count isequal to '100'
Task Status isequal to 'RanToCompletion'