【发布时间】:2011-12-27 06:22:54
【问题描述】:
假设我们有一个实时事件的侦听器,它在事件被触发时执行一些代码块。
对于我们的讨论,假设我们有一个 MyTime 类,它有一个成员 currentTime。
我们已对其进行了设置,以便每当计算机时钟发生变化时,currentTime 都会设置为当前时间的值。 我们已经为 currentTime 对象实现了属性更改的 INotifyPropertyChanged 接口:
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 块。在执行过程中,我们会不断收到越来越多的通知并尽可能快地处理它们,从而形成一长串仍有待处理的事件。
问题在于,在我们处理了第一次更改并继续进行下一次更改后,“实时”已经遥遥领先,无论我们在计算什么,我们都是在计算过去发生的事情。
我们想要做的是忽略所有新事件,直到我们完成原始处理,然后才重新开始侦听该事件。
设置多个线程不是一种选择,因为它不能解决问题,而且我们不想处理每次更改,只处理我们的资源已释放的那些。
显然,我已将时间更改和上述代码用作演示示例,但它简洁而充分地(恕我直言)展示了我们在此尝试完成的任务。
我想使用某种缓冲区,但我在这里的知识非常有限。 谢谢
感谢到目前为止的所有答案。将开始实施它。将尝试记录成功/失败。
【问题讨论】:
标签: c# events real-time buffering