将相互依赖的事件流与RX.Net相关联

时间:2014-10-29 20:57:43

标签: c# .net events system.reactive reactive-programming

我有一个课程,其中包括以下三个事件:

  • DataSourceLoaded
  • DataSourceUnloaded
  • DataSourceFieldChanged

现在我正在使用RX.Net与其.Throttle()功能相结合来减慢突发/频繁传入事件的处理速度,因为我只需要知道最近发生了哪些变化,而不是每一次都是相关的对我来说。

我遇到一些问题的部分是可以随时添加/删除基础数据源,DataSourceFieldChanged事件流的处理程序使用数据源。

所以基本上DataSourceFieldChanged事件流应该只在DataSourceLoaded事件发生后启动,一旦DataSourceUnloaded事件发生就立即停止,并在DataSourceLoaded重新发生时重新启动。等等。

发生DataSourceUnloaded事件后,所有'限制'DataSourceFieldChanged流不应再次触发..如:{em}发生了DataSourceFieldChanged事件在发生.Throttle()事件的DataSourceUnloaded时间范围内,DataSourceFieldChanged事件流不应调用处理程序。

如果(nother)DataSourceLoaded事件发生在前一个500毫秒DataSourceFieldChanged .Throttle()窗口之内或之外,它们也应该不会触发DataSourceFieldChanged处理程序。

有没有办法将这三个事件流放在一个组合的RX.Net语句中?

此外&理想情况下,如果在DataSourceFieldChanged事件发生时DataSourceUnloaded的处理程序已经在运行,是否可以将CancellationToken传递给事先触发的DataSourceFieldChanged处理程序并让我取消正在进行的活动(这样我就不会尝试访问现已消失的数据源)?

1 个答案:

答案 0 :(得分:2)

假设DataSourceLoadedDataSourceUnloaded事件总是成对出现:

from _ in DataSourceLoaded
from changed in DataSourceFieldChanged.Throttle(x).TakeUntil(DataSourceUnloaded)
select changed;

将其读作:

  1. 对于每个DataSourceLoaded事件,
  2. 项目限制DataSourceFieldChanged事件,
  3. 直到DataSourceUnloaded事件。