在我的应用程序中,当超过预设超时时,我需要强制停止任务。直到我看到我只能通过令牌取消线程,但线程仍将在后台运行。即使我在超时后抛出异常,线程仍继续运行...
有代码和结果的例子:
internal class Program
{
private static void Main(string[] args)
{
for (int i = 1; i <= 5; i++)
{
var cls = new CancellationTokenSource();
Task task = Task.Factory.StartNew(state =>
{
Console.WriteLine("Task Started" );
Timer timer = new Timer(TimeElapsed, cls, 3000, 0);
Thread.Sleep(6000);
Console.WriteLine("End Task");
}, cls.Token);
}
Console.ReadLine();
}
private static void TimeElapsed(object obj)
{
try
{
var cls = (CancellationTokenSource)obj;
cls.Cancel();
cls.Token.ThrowIfCancellationRequested();
}
catch (Exception)
{
Console.WriteLine("Aborted");
}
}
}
答案 0 :(得分:0)
您正在测试不正确的案例。
您已经创建了一个注册定期回调的计时器 - 您需要配置它的计时器以定期停止调用该方法。现在你只是取消每次调用,而不是取消回调。
相反,如果你想要一个正常的取消 - 如果你通过一个衍生的线程/ task / threadpoool调用做一些工作就是这种情况。取消令牌的使用在那里是有道理的 - 你有一些你希望取消的长期工作。