【发布时间】:2019-01-25 22:25:36
【问题描述】:
我想使用 CancellationTokenSource 停止任务。 我的测试如下:
测试 1:使用 Cancel() 成功停止任务。
测试 2:使用 CancelAfter() 并没有停止任务,为什么?
任务动作是:
static Action testFun = () => {
Thread.Sleep(4000); // or other a long time operation
Console.WriteLine("Action is end");
};
test1 代码:
CancellationTokenSource source = new CancellationTokenSource();
CancellationToken token = source.Token;
//Register the cancel action
token.Register(() =>
{
Console.WriteLine("Task is canceled");
});
Task task = new Task(testFun, token);
task.Start();
source.Cancel();
Console.ReadLine();
输出是:
Task is canceled
Test2 代码:
CancellationTokenSource source = new CancellationTokenSource();
CancellationToken token = source.Token;
//Register the cancel action
token.Register(() =>
{
Console.WriteLine("Task is canceled");
});
Task task = new Task(testFun, token);
task.Start();
source.CancelAfter(100); // the time 100ms < the task 4000ms
Console.ReadLine();
输出是:
Task is canceled
Action is end
我的问题是为什么在CancellationTokenSource 上调用CancelAfter() 时任务仍在运行
如何修改 test2 ?谢谢。
【问题讨论】:
-
答案是:Sleep 方法忽略了 CancellationToken。但是我用其他一些长时间的Funtion()替换了Sleep(),问题还在。我想知道CancelAfter()如何不停止Task。
-
Sleep 方法只不过是调用 Thread.Sleep()
-
问题在于
cancelationToken具有误导性。一旦任务开始,除非您明确检查cancelationToken,否则您无法取消它。您只能阻止任务甚至开始,而这正是Cancel发生的事情 -
正如预期的那样,任务一旦启动就不会停止,看看我的回答什么是camcelation token背后的哲学......
标签: c# asynchronous task