c# task cancellation总结
1、调用cancellationtokensource.cancel()时
只有在task的函数体内使用token.throwifcancellationrequested()方法时才会触发continuewith(action<task>,taskcontinuationoptions.onlyoncanceled),且代理函数中task的exception是null,也就是说不会抛出异常;
否则只会触发continuewith(action<task>,taskcontinuationoptions.onlyonrantocompletion),且也不会抛出异常;
2、调用task.wait()时
(1)当调用token.throwifcancellationrequested()之后,如果有onlyoncanceled延续任务,则先执行延续任务,然后在task.wait()中抛出aggregateexception异常;
(2)如果产生其他异常且有onlyonfaulted延续任务,则先执行延续任务,然后在task.wait()中抛出异常;
3、task.continuewith方法的使用
(1)public task continuewith(action<task> continuationaction,taskcontinuationoptions continuationoptions);
(2)函数的第一个参数是一个委托,其参数为执行continuewith的task实例,同时返回一个新的task实例;
(3)如果在实例化task的时候连续调用continuewith函数,实例化出来的task变量将是continuewith方法最后执行并返回的task实例,同时,每一个continuewith函数将用于执行上一步continuewith函数返回的task实例,而不是最初的task实例;
(4)在监听task.wait()时,如果有continuewith方法,要特别注意是哪个task实例;
4、使用cancellationtokensource后
需要调用dispose方法来释放其非托管资源;
5、调用cancellationtokensource.cancel()
并不会终止task的执行,只是告知task取消的请求
如果不监听cancellationtoken.iscancellationrequested属性
或者不调用throwifcancellationrequested方法
task将会一直执行;
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论