Task cancellation in C# and things you should know about it

refs:

https://binary-studio.com/2015/10/23/task-cancellation-in-c-and-things-you-should-know-about-it/



Task mechanism in C# is a powerful beast in the area of parallel and asynchrony programming. Controlling this beast may take lots of efforts and pain. .NET Framework 4 introduces a convenient approach for cancellation of asynchronous operations.

How do we control

Why should we control execution flow of the tasks? One reason is business logic or algorithm requirements. Another reason comes from an idea, that there should be no unobserved tasks. Such tasks may hold thread pool and CPU resources and therefore be dangerous.

Just for this .NET provides us with two classes:

  • CancellationTokenSource – object responsible for creating cancellation token and sending cancellation request to all copies of that token.
  • CancellationToken – structure used by listeners to monitor token current state.

How do we pass token

Firstly, we should somehow make task use created token. One way is to pass it as an argument to the method responsible for creating task.

With such approach token is only checked at the very beginning, before starting execution of task delegate code. If token cancelled then task is also put in canceled mode. In the example above message won’t be printed because token had been canceled before task were created.

But what if we want to stop task execution in particular moment of time? Then you should observe cancellation token state manually inside task delegate. There are generally two ways for passing token inside task delegate.

First way is to make token variable visible by task delegate. It can be accomplished by using global variable or variable capture.

Second way is to pass token as state object and downcast it inside task delegate.

How do we observe token

Now that we know how to access token inside a task, it is time to become acquainted with how we can observe token state. You can observe it in the three ways: by polling, using callback registration and via wait handle.

1. By polling – periodically check IsCancellationRequested property

2. Callback registration – provide callback that would be executed right after cancellation is requested

3. Waiting for wait handle provided by CancellationToken.

You can also observe multiple tokens simultaneously, by creating linked token source that can join multiple tokens into one.

How do we cancel

We already know how to pass and observe tokens. What is left is how we send cancellation request. For cancelling, we use CancellationTokenSource object. Cancellation request may be direct or deferred.

When we use Cancel method directly, it implicitly calls all registered callbacks on current thread. If callbacks throw exceptions, they are wrapped in AggregateException object that propagated then to caller.

Since callbacks is called one by one, optional boolean argument for Cancel method lets you specify behavior upon encountering exception in any of the registered callbacks.

If argument is true then exception will immediately propagate out of the call to Cancel, preventing the remaining callbacks from executing.

If argument is false, all registered callbacks will be executed with all thrown exceptions wrapped into the AggregateException.

After detecting cancellation request inside task, common approach is to throw OperationCanceledException object, to put task in canceled state.

Conclusion

Task cancellation mechanism is an easy and useful tool for controlling task execution flow. It is a part of big .NET Framework ecosystem, therefore its usage in most cases is more preferable than some custom solutions.

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值