You cannot directly interrupt a Task in .NET while it’s running. You can do it indirectly through the CancellationTokenSource object. This object has a CancellationToken property which must be passed into the constructor of the Task:
CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();
CancellationToken cancellationToken = cancellationTokenSource.Token;
The cancellation token can be used as follows:
Task newTask = Task.Factory.StartNew(() =>
{
for (int i = 0; i < 100000; i++)
{
if (cancellationToken.IsCancellationRequested)
{
Console.WriteLine("Task cancel detected");
throw new OperationCanceledException(cancellationToken);
}
else
{
Console.WriteLine(i);
}
}
}, cancellationToken);
We simply count up to 100000 in the Task body. Note the IsCancellationRequested property of the token. We monitor within the loop whether the task has been cancelled.
You can cancel the task by calling the Cancel() method of the cancellation token like this:
cancellationTokenSource.Cancel();
Note that this method only signals the wish to cancel a task. .NET will not actively interrupt the task, you’ll have to monitor the status through the IsCancellationRequested property. It is your responsibility to stop the task. In this example we throw an OperationCanceledException which is a must in order to correctly acknowledge the cancellation. If you forget this step then the task status will not be set correctly. Once the task has been requested the stop it cannot be restarted.
If that’s all you want to do, i.e. throw an OperationCanceledException, then there’s a shorter version:
cancellationToken.ThrowIfCancellationRequested();
This will perform the cancellation check and throw the exception in one step. The loop can thus be simplified as follows:
Task newTask = Task.Factory.StartNew(() =>
{
for (int i = 0; i < 100000; i++)
{
cancellationToken.ThrowIfCancellationRequested();
Console.WriteLine(i);
}
}, cancellationToken);
View the list of posts on the Task Parallel Library here.
Like this:
Like Loading...