我如何强制停止一个线程

时间:2013-09-19 15:41:44

标签: c# multithreading task

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

有代码和结果的例子:

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

enter image description here

1 个答案:

答案 0 :(得分:0)

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

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

相反,如果你想要一个正常的取消 - 如果你通过一个衍生的线程/ task / threadpoool调用做一些工作就是这种情况。取消令牌的使用在那里是有道理的 - 你有一些你希望取消的长期工作。