为什么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方法停止工作。进程方法代码运行良好,这意味着没有编译和运行时错误。
无论是否调用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;
:请参阅这篇博客文章获得简短解释。