C# 将相互依存的事件流与RX.Net关联

C# 将相互依存的事件流与RX.Net关联,c#,.net,events,system.reactive,reactive-programming,C#,.net,Events,System.reactive,Reactive Programming,我有一个班级,其中包括以下三个事件: 数据源加载 数据源卸载 数据源字段已更改 目前,我正在使用RX.Net及其.Throttle()”功能来降低突发/频繁传入事件的处理速度,因为我只需要知道最近是否发生了变化,而不是每一次事件都与我有关 我遇到的一点问题是,底层数据源可能随时被添加/删除,DataSourceFieldChanged事件流的处理程序使用该数据源 因此,基本上,DataSourceFieldChanged事件流只应在DataSourceLoaded事件发生时启动,一旦发生da

我有一个班级,其中包括以下三个事件:

  • 数据源加载
  • 数据源卸载
  • 数据源字段已更改
目前,我正在使用RX.Net及其
.Throttle()
”功能来降低突发/频繁传入事件的处理速度,因为我只需要知道最近是否发生了变化,而不是每一次事件都与我有关

我遇到的一点问题是,底层数据源可能随时被添加/删除,
DataSourceFieldChanged
事件流的处理程序使用该数据源

因此,基本上,
DataSourceFieldChanged
事件流只应在
DataSourceLoaded
事件发生时启动,一旦发生
datasourceunload
事件,立即停止,并在再次发生
DataSourceLoaded
事件时重新启动。。等等

datasourceunload
事件发生后,所有“节流”的
DataSourceFieldChanged
流不应再次触发。。如中所示:如果发生
DataSourceFieldChanged
事件,并且在500毫秒
.Throttle()
时间跨度内发生
datasourceunload
事件,则
DataSourceFieldChanged
事件流不应调用处理程序

如果(另一个)
DataSourceLoaded
事件发生在前500毫秒
DataSourceFieldChanged
.Throttle()
窗口的内部或外部,则它们也不应触发
DataSourceFieldChanged
处理程序

有没有办法将这三个事件流合并到一个RX.Net语句中


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

假设
数据源加载的事件和
数据源卸载的事件总是成对引发的:

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

  • 对于每个
    数据源加载的
    事件
  • 项目限制
    数据源字段更改
    事件
  • 直到
    数据源卸载
    事件

  • 感谢Dave!和duh.。这确实太简单了——我想它会更复杂。关于取消正在进行的订阅/为上面每个“更改”运行的方法的一个问题:当发生DataSourceUnloaded事件而更改的事件仍在处理时,您如何发出取消信号(基本上是我原始问题最后一段中的Q)?Rx中的
    OnNext
    调用是序列化的,因此如果在观察调用时触发
    datasourceunload
    ,那么您就不会再收到另一个调用。但显然存在不可避免的争用条件。根据Rx合同,它“将尽最大努力停止所有未完成的工作"。请参阅中的§4.4。为了清楚起见,我刚才引用的Rx合同意味着对
    OnNext
    的任何后续或排队调用都不会被观察到。它不会中止当前对
    OnNext
    的调用或诸如此类的操作。@JörgB。-发送当前
    数据源的观察者是相当直接的一个取消信号,这样它可以在
    数据源卸载
    事件后取消当前的工作。如果你想看到一些解决方案,就把它当作一个新的so问题。哦,我明白了,他的意思是需要取消OnNext中已经运行的工作,而不是即将运行的工作。同意,新的Q更合适,因为答案是g涉及外部状态或附加运算符。