C# 如果在应用程序中使用System.Timers.Timer,是否有必要处置它?

C# 如果在应用程序中使用System.Timers.Timer,是否有必要处置它?,c#,.net,timer,dispose,C#,.net,Timer,Dispose,我正在应用程序中的一个类中使用System.Timers.Timer类。 我知道Timer类具有从实现IDisposable接口的父组件类继承的Dispose方法。 在我的应用程序生命周期中多次创建下面类的实例;它们中的每一个都有一个Timer类的实例,该实例在类的生命周期中连续生成已用事件。 我应该在使用Timer类来处理Timer对象的类中实现IDisposable接口吗?(我见过根本不这样做的代码)。 如果我像这样使用下面的类,恐怕无法释放某些非托管资源: SomeClass someCl

我正在应用程序中的一个类中使用System.Timers.Timer类。 我知道Timer类具有从实现IDisposable接口的父组件类继承的Dispose方法。 在我的应用程序生命周期中多次创建下面类的实例;它们中的每一个都有一个Timer类的实例,该实例在类的生命周期中连续生成已用事件。 我应该在使用Timer类来处理Timer对象的类中实现IDisposable接口吗?(我见过根本不这样做的代码)。 如果我像这样使用下面的类,恐怕无法释放某些非托管资源:

SomeClass someClass = new SomeClass();
someClass.DoSomething();
someClass = null;
班级:

using System.Timers;

public class SomeClass
{
    private Timer m_timer;

    public SomeClass()
    {           
        m_timer = new Timer();
        m_timer.Interval = 1000;
        m_timer.Elapsed += new ElapsedEventHandler(m_timer_Elapsed);
        m_timer.AutoReset = false;
        m_timer.Start();                       
    }

    public void DoSomething()
    {

    }

    private void m_timer_Elapsed(object sender, ElapsedEventArgs e)
    {
        try
        {
            //Do some task
        }
        catch (Exception ex)
        {
            //Ignore
        }
        finally
        {
            if (m_timer != null)
            {
                //Restart the timer
                m_timer.Enabled = true;
            }
        }
    }
}

一般来说,你应该总是处理可支配的资源。我当然会期待在你的情况下概述上述。如果在实现计时器的类上实现IDisposable,则可以在using语句中使用该类,这意味着在释放类时将显式释放资源。

我猜计时器对象创建或使用工作线程来触发计时器事件。dispose调用将释放线程及其关联的资源。如果是这种情况,那么最好调用dispose,这样就不会有太长时间未使用的线程。

通过实现idisposable,您将能够整理任何也实现idisposable的内部资源,例如计时器

此外,您还可以更改调用代码以使用using语句

using (SomeClass someClass = new SomeClass())
{  
someClass.DoSomething();  
}  

我使用的经验法则是使任何具有IDisposable对象的对象都是IDisposable本身(并且仅当显式调用Dispose时才处理子对象)

关于IDisposable在上有一个很好的讨论,还有一些代码示例,它们看起来与我在这本优秀的书中的那些非常相似

我同意罗兰的观点


FxCop中有一条规则,可以查找包含一次性对象的类,但没有正确实现IDisposable。

我知道你在一年前问过这个问题,但让我投入我的2美分。因通货膨胀而略有减少:)。最近,我在应用程序中发现我们没有处理计时器。我们有一个对象集合,每个对象都有一个计时器。当我们从集合中移除该项时,我们认为它应该被垃圾收集。由于某种原因,计时器就不是这样了。我们必须在收集中的对象上调用dispose,以在对象实际被垃圾收集之前清除计时器。

必须释放计时器,否则在您“完成”计时器后,它将持续燃烧一段时间。但是,由于线程问题,在您处理它之后,它可能会在短时间内触发

计时器由它在封面下创建的Win32计时器保持活动状态。计时器上的事件使对象保持活动状态。请注意,
System.Timers.timer
只包装对
System.Threading.timer
的调用,并管理状态对象(底层win32 api使用的回调引用)。问得好,到目前为止还没有真正的答案,不幸的是。。。!这几乎是一个错误,但需要明确的是,using语句周围需要括号:using(SomeClass SomeClass=new SomeClass()){…}非常正确,整天在C#和VB之间跳跃。答案已更新。谢谢如果你做了一个timer.Change(Timeout.Infinite,Timeout.Infinite),你会怎么做?这不会停止触发吗(尽管可能会使通过事件调用的对象保持活动状态)。@MartinCapodici,在您对“timer.Change”的调用返回之前,它可能仍然“启动”了下一次触发。Ian,因此就另一次可能的触发而言,它听起来与您处理它一样。不同的是,处理它会释放事件记忆中的对象,而仅仅停止它不会。对于任何寻找乔·达菲博客的人来说,@Korli已经更新了链接,指向更新版本的博客博文。谢谢,这更相关。可悲的是,他的博客标记现在被破坏了。至少对我来说是这样。