私はViewModels(Silverlightおよび/またはWp7アプリケーション)でイベント処理を簡単にするためにReactive Extensionsを使用しています。単純化のための私は私のVMのctorの中で、このようなラインを持っているとしましょう:IObserversの処分はどうすればよいですか?
Observable.FromEvent<PropertyChangedEventArgs>(
h => MyObject.PropertyChanged += h,
h => MyObject.PropertyChanged -= h)
.Where(e=>e.PropertyName == "Title")
.Throttle(TimeSpan.FromSeconds(0.5))
.Subscribe(e=>{/*do something*/});
これは、IDisposableのオブジェクトを返し、配置された場合が解除されます。(私はこの仮定の通りですか?)
私がそれを参照していなければ、遅かれ早かれそれが収集され、ハンドラは登録解除されます。
通常、私のVMにはList<IDisposable>
があります。サブスクリプションを追加しますが、正しいRx方法で何かをやっていないかのように、私はそれについて汚れています。
このような状況で推奨されるパターンは何ですか?
.NETメモリのイベントリークについて知っていますが、IObservableがオブザーバをFinalizeに配置しても問題はありません。なぜなら、finalizeはここで呼び出されないからです...ありがとうございます! – TDaver
'IObservable'がどのように動作して使用されるべきかを指定していたなら、正しく書かれたすべての消費者は返された 'IDisposable'のどこかへの参照を保持しなければならないと指定し、実装は自由に考えるべきです( )関連付けられた 'IDisposable'が範囲外になったサブスクリプションをキャンセルします。 –
supercat