如何在C#中释放计时器使用的资源尝试了以下方法,但我的应用程序中没有任何工作。
t.Dispose();
t.Stop();
t.EndInit();
t.Close();
答案 0 :(得分:2)
你怎么知道它不起作用?
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()方法中调用它。它将打印“你好”。持续5秒钟,然后处理计时器并且不会再次调用t_Elapsed。再过5秒钟,应用程序退出。
答案 1 :(得分:0)
在C#中,资源不会立即释放,因为它是一个托管环境。当您调用Dispose()
时,它会标记垃圾收集的资源。虽然,垃圾收集不会通过调用Dispose自动开始,而是在它看起来合适时由Runtime Environment启动。
因此,当运行时环境决定需要释放一些资源时,只需调用Dispose并处理资源。
See this link for a further description of Garbage Collection.
答案 2 :(得分:0)
我猜这是一个System.Timers.Timer,给出你上面的列表。
你应该可以这样做:
t.Stop();
t.Dispose();
完成此操作后,计时器将停止,其主要(非托管)资源将被释放。但是,在所引用的所有元素不再以应用程序为根,并且GC可以清除它们之前,它所使用的资源将不会被清除。
确保允许您的t变量超出范围,并且允许t计时器使用的任何内容超出范围。如果这样做,GC将在准备好的时刻清理这些对象。