Предположим, у нас есть прослушиватель события в реальном времени, который выполняет некоторый блок кода при инициировании события.
для нашего обсуждения, скажем, у нас есть класс MyTime, который имеет член currentTime.
мы настроили его так, чтобы при каждом изменении часов компьютера значение currentTime устанавливалось на значение текущего времени.Мы реализовали свойство измененного интерфейса INotifyPropertyChanged для нашего объекта currentTime:
public event PropertyChangedEventHandler PropertyChanged;
public string currentTime
{
get { return _currentTime; }
set { _currentTime= value; this.NotifyPropertyChanged("currentTime"); }
}
public void NotifyPropertyChanged(object sender, PropertyChangedEventArgs e) {
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(name));
}
Какой-то другой класс, скажем, ProcessTime, прослушивает это событие:
TimeChanged += new PropertyChangedEventHandler(PropertyChanged};
, и у него есть функция, котораявыполнит что-то:
public void TimeChanged(object sender, PropertyChangedEventArgs e)
{
// Process lots of calculations
}
Поскольку часы нашего компьютера постоянно меняются, оно будет запускать событие.В моем понимании, когда произойдет первое изменение, мы выполним блок TimeChanged.Пока мы выполняем, мы будем продолжать получать все больше и больше уведомлений и обрабатывать их как можно быстрее, создавая длинную очередь событий, которые еще предстоит обработать.
Проблема заключается в том, что после обработки первого изменения времении перейдем к следующему изменению времени, «реальное время» уже далеко впереди, и все, что мы рассчитываем, мы рассчитываем на то, что произошло в прошлом.
То, что мы хотели бы сделать, это игнорироватьвсе новые события до тех пор, пока мы не закончим нашу первоначальную обработку, и только затем снова начнем прослушивать событие.
Настройка нескольких потоков не является опцией, поскольку она не решает проблему, и мы не хотим обрабатыватькаждый раз меняются только те, когда наши ресурсы высвобождаются.
Очевидно, я использовал изменение времени и приведенный выше код в качестве наглядного примера, но он демонстрирует кратко и адекватно (ИМХО) то, что мы пытаемсячтобы выполнить здесь.
Я хотел бы использовать какой-то буфер, но мойзнание здесь очень и очень ограничено.Спасибо
Спасибо за все ответы до сих пор.Начнем реализацию.Постараюсь задокументировать успехи / неудачи.