Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 对象未在未参考计时器框架4.8的情况下发布_C#_Timer - Fatal编程技术网

C# 对象未在未参考计时器框架4.8的情况下发布

C# 对象未在未参考计时器框架4.8的情况下发布,c#,timer,C#,Timer,请参见下面的示例。即使对obj的引用设置为null,obj也不会释放,obj_将继续打印i。请注意,在ObjectWithTimer构造函数的作用域之外没有对计时器的引用 公共课程 { 在此实例中设置null和/或超出范围不够好,计时器有其管理的资源,需要清理 由于System.Timers.Timer实现IDisposable,理想情况下包装器类也应该实现IDisposable 然后,您还应该在某个阶段处理调用的包装器,而不仅仅是将其设置为null,最简单的方法是使用 提供方便的语法,确保正确

请参见下面的示例。即使对obj的引用设置为null,obj也不会释放,obj_将继续打印i。请注意,在ObjectWithTimer构造函数的作用域之外没有对计时器的引用

公共课程 {

在此实例中设置null和/或超出范围不够好,计时器有其管理的资源,需要清理

由于System.Timers.Timer实现IDisposable,理想情况下包装器类也应该实现IDisposable

然后,您还应该在某个阶段处理调用的包装器,而不仅仅是将其设置为null,最简单的方法是使用

提供方便的语法,确保正确使用 可识别的对象

实现Dispose方法以释放所使用的非托管资源 您的应用程序。NET垃圾回收器不分配或 释放非托管内存

注意:这不是关于IDisposable模式的完整教程,只是一个示例。请对此实现进行自己的研究和努力

额外资源


您似乎只提供了实验的部分代码-我看不到任何GC.Collect调用…除非您的问题是为什么将object设置为null不会导致GC…这个特殊的重复项深入了很多关于System.Timers.Timer和System.Threading.Timer行为之间差异的细节。请注意,您确实可以发现通过使用VS performance profiler或任何其他.NET内存分析器来查看特定对象在任何时间点是否有对它的引用。
    public static void Main(string[] args)
    {
        object obj = new ObjectWithTimer();
        Console.ReadLine();
        Console.WriteLine("obj=null");
        obj = null;
        Console.ReadLine();
    }
}

public class ObjectWithTimer
{
    private int i;
    public System.Timers.Timer t;
    public ObjectWithTimer()
    {
        t = new System.Timers.Timer(5000);
        t.Elapsed += Obj_Elapsed;
        t.Enabled = true;
    }

    public void Obj_Elapsed(object sender, ElapsedEventArgs e)
    {
        i++;
        Console.WriteLine(i);
    }
}
public class ObjectWithTimer : IDisposable
{
   // Flag: Has Dispose already been called?
   private bool _disposed = false;

   private int _i;
   public System.Timers.Timer Timer { get; }
   public ObjectWithTimer()
   {
      Timer = new System.Timers.Timer(5000);
      Timer.Elapsed += Obj_Elapsed;
      Timer.Enabled = true;
   }

   public void Obj_Elapsed(object sender, ElapsedEventArgs e)
   {
      _i++;
      Console.WriteLine(_i);
   }

   // Public implementation of Dispose pattern callable by consumers.
   public void Dispose() =>Dispose(true);


   // Protected implementation of Dispose pattern.
   protected virtual void Dispose(bool disposing)
   {
      if (_disposed) return; 
      if (disposing) Timer?.Dispose();  
      _disposed = true;
   }
}
public static void Main(string[] args)
{
    using(object obj = new ObjectWithTimer())
    {
       Console.ReadLine();
       Console.WriteLine("obj=null");
    }
    Console.ReadLine();
}