.NET计时器 - 资源清理

时间:2009-07-23 17:33:18

标签: c#

如何在C#中释放计时器使用的资源尝试了以下方法,但我的应用程序中没有任何工作。

            t.Dispose();
            t.Stop();
            t.EndInit();
            t.Close();

3 个答案:

答案 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将在准备好的时刻清理这些对象。