1

在我的应用程序中,当任务超过预设超时时,我需要强制停止任务。直到我看到我只能通过令牌取消线程,但线程仍然会在后台运行。即使我在超时后抛出异常,线程也会继续运行......

有代码和结果示例:

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"); 
        }
    }
}

在此处输入图像描述

4

1 回答 1

0

您正在测试一个不正确的案例。

您已经创建了一个注册定期回调的计时器 - 您需要处置计时器以使其停止定期调用该方法。现在您只是取消每个调用,而不是取消回调。

相反,如果您想要正常取消 - 如果您通过衍生的线程/任务/线程池调用做一些工作,就会出现这种情况。取消令牌的使用在那里是有意义的——你有一些你想取消的长期运行的工作。

于 2013-09-19T15:54:17.873 回答