2

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

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 方法停止工作。处理方法代码运行完美意味着没有编译和运行时错误。

4

1 回答 1

3

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

现在,在某些时候,您stateTimer将被垃圾收集,因为它已超出范围。此时计时器将不再被触发。最有可能的是,当您打电话时,这种垃圾收集会发生得更快Process()

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

要修复它,请创建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)
    {
        // ...
    }
}

PS:我假设这段代码是因为你一直在试验,但是如果你想重新抛出你捕获的异常,你应该throw;不带任何参数使用:请参阅这篇博客文章以获得简要说明。

于 2013-02-22T06:36:11.920 回答