Подтвердить что ты не робот

Необходимо ли использовать System.Timers.Timer, если вы используете его в своем приложении?

Я использую класс System.Timers.Timer в одном из классов моего приложения. Я знаю, что класс Timer имеет метод Dispose, унаследованный от родительского класса Component, который реализует интерфейс IDisposable. Экземпляры класса ниже создаются много раз в течение жизненного цикла приложения; каждый из них имеет экземпляр класса Timer, который непрерывно генерирует истекшие события во время жизненного цикла класса. Должен ли я реализовать интерфейс IDisposable в классе, который использует класс Timer для размещения объекта таймера? (Я видел код, который не делает этого вообще). Я боюсь, что некоторые неуправляемые ресурсы не будут освобождены, если я использую следующий класс следующим образом:

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;
            }
        }
    }
}
4b9b3361

Ответ 1

В общем, вы всегда должны распоряжаться располагаемыми ресурсами. Я, конечно, буду смотреть в том случае, если вы начертите выше. Если вы реализуете IDisposable в классе, который реализует таймер, вы можете затем использовать класс в операторе using, то есть ресурсы будут явно выпущены, когда ваш класс будет удален.

Ответ 2

Я вижу, что вы задавали этот вопрос год назад, но позвольте мне забросить мои 2 цента. Чуть меньше из-за инфляции:). Недавно я обнаружил в нашем приложении, что мы не располагаем таймерами. У нас была коллекция объектов, и у каждого объекта был таймер. Когда мы удалили элемент из коллекции, мы подумали, что он должен был собрать мусор. По какой-то причине не так с таймерами. Нам пришлось вызывать dispose на объекте в коллекции, чтобы избавиться от таймера до того, как объекты были фактически собраны мусором.

Ответ 3

Правило большого пальца, которое я использую, состоит в том, чтобы сделать все, что имеет объект IDisposable, IDisposable сам (и удалять дочерние объекты только тогда, когда Dispose явно вызван)

Там хорошая дискуссия о IDisposable в блог Джо Даффи вместе с образцами кода, которые очень похожи на те, что были в моей копии отличного Руководство по разработке рамок

Ответ 4

Таймер должен быть удален, или он будет продолжать огонь в течение некоторого времени после того, как вы "закончите" с ним. Однако из-за проблем с потоками он может по-прежнему срабатывать через короткое время после того, как вы его разместили!

Ответ 5

Я бы предположил, что объект таймера создает или использует рабочий поток для запуска событий таймера. Вызов dispose освободит поток и связанные с ним ресурсы. Если это так, было бы неплохо вызвать dispose, чтобы у вас не было неиспользуемых нитей, слишком долго зависающих.

Ответ 6

Внедряя idisposable, вы сможете убрать любые внутренние ресурсы, которые также реализуют idisposable, такие как ваш таймер.

Кроме того, вы сможете изменить свой код вызова, чтобы использовать используемую запись.

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

Ответ 7

Я согласен с Роуленд.

В FxCop существует правило, которое находит классы, содержащие одноразовые объекты, но не правильно реализует IDisposable.