为什么C#线程自动停止工作

本文关键字:停止工作 线程 为什么 | 更新日期: 2023-09-27 18:00:34

我的程序中有一个线程,它运行计时器功能,例如

Thread PopMonitoringThread = new Thread(new ThreadStart(PopMonitoring));  
PopMonitoringThread.Start();
public static void PopMonitoring()
{
    TimerCallback callback = new TimerCallback(Tick);
    Timer stateTimer = new Timer(callback, null, 0, 1000);
}
//Timer method
static public void Tick(Object stateInfo)
{
    try
    {
        if (Properties.Settings.Default.BatchingMode > 0)
        {
            if (batchTime.Subtract(DateTime.Now) < TimeSpan.Zero)
            {
                batchTime = DateTime.Now.AddMinutes(Properties.Settings.Default.BatchingMode);
                Console.WriteLine("-----------------------------------------------------");
                Process();
                Console.WriteLine("Batch Process Run");
                Console.WriteLine("-----------------------------------------------------");
            }
            Console.WriteLine("{0}", DateTime.Now.ToString("h:mm:ss"));
        }
        Console.WriteLine("Pop3 Monitoring start after: {0}", batchTime.Subtract(DateTime.Now));
    }
    catch (Exception e)
    {
        throw e;
    }
}

当我注释掉我的Process()方法时,它每秒钟都很好,我的计时器交互工作但当我从Tick方法中取消注释Process方法时,计时器停止工作,即Tick方法停止工作。进程方法代码运行良好,这意味着没有编译和运行时错误。

为什么C#线程自动停止工作

无论是否调用Process(),您正在创建的线程几乎立即停止。你在线程中所做的就是启动一个计时器。实际的CCD_ 2方法正在来自线程池的后台线程中执行。

现在,在某个时刻,您的stateTimer将被垃圾收集,因为它已经超出了范围。此时,计时器将不再被触发。最有可能的是,当您调用Process() 时,这种垃圾收集发生得更快

您可以通过在Tick方法中调用GC.Collect()来测试它。你会看到它在一两次滴答声后停止。

若要修复此问题,请将stateTimer设为成员变量。失去Thread的东西:

class Program
{
    private static Timer _stateTimer;
    static void Main(string[] args)
    {
        _stateTimer = new Timer(Tick, null, 0, 1000);
        Console.ReadLine();
    }
    static public void Tick(Object stateInfo)
    {
        // ...
    }
}

附言:我认为这段代码是因为你一直在尝试,但如果你想重新抛出你发现的异常,你应该使用不带任何参数的throw;:请参阅这篇博客文章获得简短解释。