C# 对象未在未参考计时器框架4.8的情况下发布
请参见下面的示例。即使对obj的引用设置为null,obj也不会释放,obj_将继续打印i。请注意,在ObjectWithTimer构造函数的作用域之外没有对计时器的引用 公共课程 { 在此实例中设置null和/或超出范围不够好,计时器有其管理的资源,需要清理 由于System.Timers.Timer实现IDisposable,理想情况下包装器类也应该实现IDisposable 然后,您还应该在某个阶段处理调用的包装器,而不仅仅是将其设置为null,最简单的方法是使用 提供方便的语法,确保正确使用 可识别的对象 实现Dispose方法以释放所使用的非托管资源 您的应用程序。NET垃圾回收器不分配或 释放非托管内存 注意:这不是关于IDisposable模式的完整教程,只是一个示例。请对此实现进行自己的研究和努力 额外资源C# 对象未在未参考计时器框架4.8的情况下发布,c#,timer,C#,Timer,请参见下面的示例。即使对obj的引用设置为null,obj也不会释放,obj_将继续打印i。请注意,在ObjectWithTimer构造函数的作用域之外没有对计时器的引用 公共课程 { 在此实例中设置null和/或超出范围不够好,计时器有其管理的资源,需要清理 由于System.Timers.Timer实现IDisposable,理想情况下包装器类也应该实现IDisposable 然后,您还应该在某个阶段处理调用的包装器,而不仅仅是将其设置为null,最简单的方法是使用 提供方便的语法,确保正确
您似乎只提供了实验的部分代码-我看不到任何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();
}