2014-10-29 75 views
0

我有一個類有(其中包括)以下三個事件:歸屬關係相互依賴事件流與RX.Net

  • DataSourceLoaded
  • DataSourceUnloaded
  • DataSourceFieldChanged

現在我我正在使用RX.Net以及其.Throttle()的功能來減慢突發/頻繁進入事件的處理,因爲我只需要知道IF最近發生了什麼變化,n每一次事件都與我有關。

我有一些問題的部分是可能隨時添加/刪除底層數據源,並且DataSourceFieldChanged事件流的處理程序使用數據源。

所以基本上DataSourceFieldChanged事件流應該只有一次DataSourceLoaded事件發生開始,立即停止一旦發生DataSourceUnloaded事件並重新啓動每當DataSourceLoaded又發作了..等等。

之後發生的事件DataSourceUnloaded,所有的「節流」 DataSourceFieldChanged流然而它不能再次觸發..爲:如果一個DataSourceFieldChanged事件發生的500ms的時間跨度.Throttle()一個DataSourceUnloaded事件發生內,該DataSourceFieldChanged事件流不應該調用處理程序。

如果一個(nother)DataSourceLoaded事件發生在前500ms內或以外的地方DataSourceFieldChanged.Throttle()窗口也會發生,它們也應該不會觸發DataSourceFieldChanged處理程序。

有沒有什麼辦法可以將這三個事件流合併到一個組合的RX.Net聲明中?

而且&理想,如果DataSourceFieldChanged處理程序,而DataSourceUnloaded事件發生時已在運行,是有可能沿着CancellationToken傳遞到該得到事先觸發DataSourceFieldChanged處理程序,並讓我取消正在進行的活動(所以我不試圖訪問現在已經過去的數據源)?

回答

2

假設DataSourceLoadedDataSourceUnloaded事件總是引發成對:

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

它讀成:

  1. 對於每個DataSourceLoaded事件,
  2. 項目節流DataSourceFieldChanged事件,
  3. 直到一個DataSourceUnloaded事件。
+0

謝謝戴夫!而且,那真的太容易了 - 認爲它會更復雜。關於取消上述每個'更改'的正在進行的訂閱/方法的一個Q:當發生DataSourceUnloaded事件時,如何發出信號取消的信號?當更改的事件仍在處理中時(基本上是我原始問題最後一段中的Q)? – 2014-10-30 22:42:58

+0

Rx中的OnNext'調用被序列化,因此如果在觀察呼叫時DataSourceUnloaded觸發,那麼您將不會再接收到另一個呼叫。但顯然有一個不可避免的競爭條件。根據Rx合同,它「將盡最大努力阻止所有未完成的工作」。請參閱[Rx設計指南](http://go.microsoft.com/fwlink/?LinkID=205219)中的第4.4節。 – 2014-10-31 04:01:51

+0

需要說明的是,我剛剛引用的Rx合約意味着任何後續或排隊的OnNext都不會被遵守。它不會中斷當前對OnNext的調用或類似的事情。 – 2014-10-31 04:07:19