を中断することなくRxのフレームワークは:...ポーリング低レベルのデバイスの状態(の変化)によって生成された観察光源与えられた原観察シーケンス
// observable source metacode:
IObservable<DeviceState> source = Observable.Interval(TimeSpan.FromSeconds(0.5))
.Select(tick => new DeviceState(_device.ReadValue()))
.DistinctUntilChanged();
をタイムアウトにアクションを実行します.. 。そしてUIを更新し、消費者...
// UI metacode:
service.GetObservableDeviceStates()
.Subscribe(state => viewModel.CurrentState = state.ToString());
...私はソースにサブスクリプションを中断することなく、ソースの「非アクティブ」のx秒後にカスタムアクションを実行する必要があります。このようなもの:
// UI metacode:
service.GetObservableDeviceStates()
.DoOnTimeout(TimeSpan.FromSeconds(x),() => viewModel.CurrentState = "Idle")
.Subscribe(state => viewModel.CurrentState = state.ToString());
ベストプラクティスは何ですか?心に来る可能性のある解決策は、(私はのRxのnoobだ)、次のとおりです。
- Buffer(それはそう読めるない場合でも)
- this Timeout overload遊ん。
何が(代わりにDistinctUntilChangedを使用しての)変化しない何か特別な "サービス側" を返すと、UIのコードでそれを扱う:
service.GetObservableDeviceStates() .Subscribe(状態=> viewModel.CurrentState = state.Special? "Idle":state.ToString());
EDIT:in the answerが報告されているように、溶液である:
service.GetObservableDeviceStates()
.Do(onNext)
.Throttle(TimeSpan.FromSeconds(x))
.Subscribe(onTimeout);
EDIT2(警告)
onNextとOnTimeoutパス更新UIコンポーネント場合、CrossThreadExceptionsを回避する ObserveOn(uiSynchronizationContext) Throttleは別のスレッドで動作するため、必要です。一定の時間であなたを通知していない観察できると述べている場合、例えばのためにデフォルト値を返すことかOnError
-
service.GetObservableDeviceStates()
.ObserveOn(uiSynchronizationContext)
.Do(onNext)
.Throttle(TimeSpan.FromSeconds(x))
.ObserveOn(uiSynchronizationContext)
.Subscribe(onTimeout);
に属しどことどまるあなたに、そこにスロットリングタイマーを実行するために絞るパラメータとしてUIスレッドスケジューラを指定できることを意味します追加のObserveOnホップを避けたい場合。 –
@BartDeSmet私はすでにThrottle(x、Scheduler.CurrentThread)を試しましたが、私はUIの応答性を失っていました...私の場合、ObserveOnはうまく機能しました – Notoriousxl