如何在C#中释放计时器使用的资源尝试了以下方法,但在我的应用程序中都不起作用。
t.Dispose();
t.Stop();
t.EndInit();
t.Close();发布于 2009-07-23 17:36:05
你怎么知道它不起作用?
Dispose()应该可以工作。之后你还可以使用计时器吗(如果它工作得很好,你就不应该使用了)?
如果你想释放内存,你必须调用GC.Collect()。
此外,建议将计时器包装在using语句中(如果您在其他地方不需要计时器):
using (Timer t = new Timer())
{
// Do stuff with t
}然后将自动调用Timer.Dispose()。
下面是一个配置计时器的示例:
static void TimerTest()
{
using (Timer t = new Timer(200))
{
t.Start();
t.Elapsed += new ElapsedEventHandler(t_Elapsed);
System.Threading.Thread.Sleep(5000); // Do some work here.
}
System.Threading.Thread.Sleep(5000); // Wait before closing the application
}
static void t_Elapsed(object sender, ElapsedEventArgs e)
{
Console.WriteLine("Hello.");
}在Main()方法中调用它。它将打印“Hello”。5秒后,定时器被释放,t_Elapsed不会再被调用。再过5秒,应用程序退出。
发布于 2009-07-23 17:36:40
在C#中,资源不会立即释放,因为它是一个托管环境。当您调用Dispose()时,它会将资源标记为垃圾收集。不过,垃圾收集不会通过调用Dispose自动开始,而是由Runtime Environment在它认为合适的时候启动。
因此,当运行时环境决定需要释放一些资源时,只需调用Dispose,资源就会得到处理。
See this link for a further description of Garbage Collection.
发布于 2009-07-23 17:38:57
根据上面的列表,我猜这是一个System.Timers.Timer。
您应该能够执行以下操作:
t.Stop();
t.Dispose();完成此操作后,计时器将停止,其主要(非托管)资源将被释放。但是,直到引用的所有元素不再植根于应用程序,并且GC可以清理它们时,它所使用的资源才会被清理。
确保允许t变量超出作用域,并且允许t计时器使用的任何内容超出作用域。如果你这样做的话,GC会在准备好的时候清理这些对象。
https://stackoverflow.com/questions/1173305
复制相似问题