Member 12014273 Ответов: 1

Получить метод eventhandler из таймера


private void StopTimer(System.Timers.Timer myTimer, ElapsedEventHandler onIntervalElapsed)
        {
            //Derive onIntervalElapsed from myTimer and store in variable.
            //var propertyFromNonPublicMembers = e.g. myTimer.GetProperty("onIntervalElapsed");
            

            if (myTimer != null)
            {
                if (myTimer.Enabled == true)
                    myTimer.Enabled = false;

                try
                {
                    myTimer.Elapsed -= onIntervalElapsed;
                    //myTimer.Elapsed -= propertyFromNonPublicMembers;
                }
                catch (Exception)
                {
  
                }
                finally
                {
                    myTimer.Dispose();
                    myTimer = null;
                    Debug.WriteLine(DateTime.Now.ToString("HH:mm:ss.fff") + $" Timer {myTimer} stopped");
                }
            }
        }


Что я уже пробовал:

В настоящее время проходит система.Таймеры.Таймер и ElapsedEventHandlerTried к методу StopTimer

Интересно, можно ли его получить "onIntervalElapsed" значение от myTimer для того, чтобы отписаться от таймера.Прошедшее событие и, следовательно, необходимость передачи ElapsedEventHandler onIntervalElapsed методу в первую очередь.

Richard MacCutchan

Показывает ли документация, что это одно из свойств таймера?

1 Ответов

Рейтинг:
0

BillWoodruff

Система.Таймеры.Таймер есть "... для использования в качестве серверного или сервисного компонента в многопоточной среде; он не имеет пользовательского интерфейса и не виден во время выполнения." MSDN ... Почему вы выбрали именно этот таймер из 4-х доступных типов таймеров ?

Зачем вам нужно, чтобы получить 'ElapsedEventHandler во время выполнения ? Почему бы просто не определить его и не использовать ссылку на него, например так:

System.Timers.Timer myTimer = new System.Timers.Timer();

private void MyTimerOnElapsed(object sender, ElapsedEventArgs e)
{
    // whatever
}

private void StopTimer()
{
    myTimer.Stop();
    myTimer.Elapsed -= MyTimerOnElapsed;
    myTimer.Dispose();
    myTimer = null;
    Debug.WriteLine(DateTime.Now.ToString("HH:mm:ss.fff") + $" Timer {myTimer} stopped");
}


Member 12014273

В приложении form, которое я использую, определено несколько таймеров, работающих с разными интервалами. Каждый таймер имеет свой собственный += ElapsedEventHandler определенный.

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

Это работает, но мне было интересно, смогу ли я устранить необходимость передачи ElapsedEventHandler для каждого конкретного таймера.

BillWoodruff

Привет, но ваш код деактивирует ElapsedEventHandler только для одного таймера. Кстати: вы можете установить EventHandler в 'null, и это не вызовет ошибку, если событие не имеет обработчиков.

также mytimer.Elapsed = null; // посмотрите, работает ли это в вашем коде

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

твое здоровье, Билл