【问题标题】:How I can force-stop a thread [duplicate]我如何强制停止线程[重复]
【发布时间】:2013-09-24 19:18:27
【问题描述】:

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

有代码和结果示例:

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

【问题讨论】:

  • 你确定吗?你想残忍地杀死线程? Abort() 是你要找的吗?

标签: c# multithreading task


【解决方案1】:

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

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

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

【讨论】:

  • 如果在启动计时器 4 参数中定义为 0 - 它将不是周期性的并且执行一次。
猜你喜欢
  • 1970-01-01
  • 2011-08-22
  • 2013-11-22
  • 2012-10-11
  • 1970-01-01
  • 1970-01-01
  • 2014-11-30
  • 2021-05-09
  • 1970-01-01
相关资源
最近更新 更多