在实例无法访问后,定时器回调仍在运行

时间:2015-06-17 20:57:16

标签: c# multithreading timer garbage-collection weak-references

离开范围后,线程TimerTest.exe!TimerTest.TimeClass.Callback(object state)仍在运行。

避免此类正在运行的线程的最佳做法是什么?

  1. IDisposable类TimerClass?
  2. 添加析构函数?
  3. 实施一个处理计时器的方法?
  4. 小样本:

    using System;
    using System.Threading;
    
    namespace TimerTest
    {
        internal class Program
        {
            private static void Main(string[] args)
            {
                // just a scope
                {
                    var timerClass = new TimerClass(1);
                }
    
                Console.ReadKey();
            }
        }
    
        internal class TimerClass
        {
            private Timer timer;
    
            public TimerClass(int i)
            {
                this.timer = new Timer(Callback, i, 500, 1000);
            }
    
            private void Callback(object state)
            {
                Console.Out.WriteLine("Timer: " + state);
            }
        }
    }
    

1 个答案:

答案 0 :(得分:0)

当您在主线程中启动计时器时,实际上会在线程池中启动一个新线程。

如果要实现IDispoable并使用like:

创建计时器类
(using var timerClass = new TimerClass(1))
{
    your code here....
}

在dispose方法中,您需要从计时器中删除refence,以便GC收集此对象,因为不再有参考此对象。

我的意见的最佳方法是使用IDispoe和使用...

当你达到命中量时,你也可以在回调方法中清除计时器中的refenrce。

关于弱参与 - 我不确定这种情况是否符合定义