EventHandler可以批量响应事件吗?

时间:2013-11-24 22:02:34

标签: c# xaml events windows-phone-8

在我的应用程序中,我有一个事件处理程序,它监听一个事件,告诉它更新一些UI 每次从Web服务下载一个项目时都会触发此事件。

是否有可能让事件处理程序延迟处理这些事件,直到它们停止触发为止(例如,在最后一个事件被触发后三秒才更新UI?)

我目前的计划是记录自上次从事件处理程序更新UI以来的时间,当它超过某个阈值时,再次更新它,但我希望C#中存在原生内容。
编辑:这不起作用,因为它依赖于后续事件来检查时间,如果我只收到一个事件,那将会失败。

2 个答案:

答案 0 :(得分:2)

您可以使用RX扩展程序执行此操作。

Observable.Buffer方法缓存在给定时间跨度内到达的事件,然后为您提供包含所有源的平面列表。

Observable.Buffer(Observable.FromEvent(this, "DataUpdated"), TimeSpan.FromSeconds(3))
                  .ObserveOnDispatcher()
                  .Subscribe(e =>
                  {
                      // Do something here...
                  });

这将使所有事件持续3秒并调用处理程序。

答案 1 :(得分:0)

我会抽出一些东西。使用事件处理程序将事件通知的记录放入事件通知队列中。然后,启动另一个线程上的队列读取器(称之为ReadEventQueue()方法):

  1. 阻止对ReadEventQueue的任何其他调用:只需设置一个IsQueueReading的静态变量。在ReadEventQueue方法的开头将其设置为true。如果方法开头的值为true,则退出方法而不做任何操作。
  2. 读取队列中的第一项(如果存在)。
  3. 如果队列包含项目,则处理该项目并更新您的UI。
  4. 将队列阅读器线程暂停3秒钟
  5. 检查队列中是否有其他项目。如果有,请转到步骤3.否则,退出并将IsQueueReading设置为false。