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

本文关键字:回调 运行 计时器 访问 实例 | 更新日期: 2023-09-27 17:56:53

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

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

  1. ID是可用的类计时器类?
  2. 添加析构函数?
  3. 实现释放计时器的方法?

小样本:

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

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

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

如果你要实现 IDispoable 并使用如下方法创建计时器类:

(using var timerClass = new TimerClass(1))
{
    your code here....
}

在 dispose 方法中,您需要从计时器中删除引用,以便 GC 将收集此对象,因为将不再有对该对象的引用。

对于我的opnion来说,最好的方法是将IDispoe与使用...

您还可以在达到命中量时从回调方法中的计时器中清除 refenrce。

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