C# Определите, какой из нескольких таймеров истек - PullRequest
0 голосов
/ 30 марта 2020

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

Если нет, то кажется, что все объекты в моем массиве должны были бы перехватывать свои собственные таймеры, и мне нужно было бы реализовать совершенно другой делегат, который бы принимал что-то вроде InnerObject в качестве параметра, чтобы внутренние объекты имели собственный обработчик событий можно было бы назвать это так: OuterDelegate (this, eventArgs);

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

Ответы [ 2 ]

3 голосов
/ 30 марта 2020

Ответ на ваш вопрос довольно прост. event handler события System.Timers.Timer Elapsed публикуется с аргументом sender.

  _timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
    {
    }

На самом деле sender является экземпляром класса System.Timers.Timer, который прошел. Итак, с этим вы можете узнать, что таймер истек ...

Более того, этот класс может быть расширен / унаследован, что означает, что вы можете создать свой собственный класс Timer с дополнительным свойством Name, который вы можете использовать, чтобы сравнить и узнать, какой таймер истек. Пример:

        class CustomTimer : System.Timers.Timer {
           public string TimerName { get; set; }
           //More properties as you need
            }
            //common handler for array of timers
            private void _timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) {
                var elapsedTimer = sender as CustomTimer;
                if (elapsedTimer.TimerName.Equals(/*which ever*/)) {
                    //continue with logic
                }
                // continue with logic
            } 
0 голосов
/ 30 марта 2020

Что ж, получается, что System.Timers - полный мусор, но не единственный выбор. System.Threading.Timer имеет именно те функции, которые я искал. Я просто не осознавал, что существует две версии, пока не наткнулся на некоторые жалобы, которые подсказали мне тот факт, что они не совпадают, и я наконец-то посмотрел на многопоточную версию.

Редактировать:

* 1004 Обратный вызов * System.Threading.Timer выглядит следующим образом
public delegate void TimerCallback(object state);

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

Edit-2

Единственное, неопределенно похожее, что присуще Системе. Реализация таймеров - это возможность присоединить System.ComponentModel.ComponentCollection и возможность указывать на компонент внутри коллекции. Это COM-объекты, принадлежащие System. Windows. Forms. Control. Даже если вы расширяете класс в соответствии со своими потребностями, вы тащите с собой поддержку непригодных для использования свойств.

Вы можете так же легко расширить System.Threading.Timer, не таща за собой ненужный багаж.

...