项目中有两种耗时的任务,界面上都使用Task异步执行的,提供取消和进度显示功能。
一种是:
任务循环执行很多小步骤,比如方法A执行一次是1s,那么整个任务TaskA执行了1000次,此时我使用CancellationTokenSource并借助IProcess,在每次循环时候检查是否取消以来实现异步取消和进度显示。
另一种是:
数据库操作,一个ado.net执行sql,然后语句本身就相当于原子操作,很耗时,比如
方法B执行一次就100s,此时因为使用的是Task,我不太知道怎么在TaskB Running时结束它?
而且像这种情况下操作几乎无法提供有意义的“进度”,就好像网页获取数据那样只能是一直”显示转圈...“。
@_@
请教下第二种情况该怎么取消任务呢?
Thread有个Abort,但是Task好像没哦。
觉着ado.net是较早的库了,新的Task和这些类合作起来不是很舒服哎。。
函数本身是无法取消的话,只能靠线程或进程强制终止来结束其执行。 Task本身只是线程调用的一个封装,它没提供类似Abort之类的强制终止函数, 本身Abort就是不建议使用的,它会导致没有进行有效的终结操作,可能导致资源泄露及一些不可预期的错误。
如果你不在乎这个任务在执行期间占用了一个线程的开销的话,大可以仍然使用CancellationTokenSource,Task操作等该操作执行完后,看到其已经被取消了,不使用其结果即可。如果你在乎这个开销而又不关心Abort带来的隐患,可以直接用Thread或用Thread封装成一个支持取消的Task。