延長方法Subscribe
によって返却された使い捨て品は、観察可能なものが終了する前に、観察可能なから手動で退会できるように返されます。が自然終了します。
観測可能リストが完了すると、OnCompleted
またはOnError
のいずれかで、サブスクリプションはすでに削除されています。あなたは上記のことがわかります実行する場合
var xs = Observable.Create<int>(o =>
{
var d = Observable.Return(1).Subscribe(o);
return Disposable.Create(() =>
{
Console.WriteLine("Disposed!");
d.Dispose();
});
});
var subscription = xs.Subscribe(x => Console.WriteLine(x));
:
このコードを試してみてください「配置されているの!」サブスクリプションで.Dispose()
というコールを必要とせずに観測が完了するとコンソールに書き込まれます。注意すべき
一つ重要なこと:あなたのサブスクリプションがスコープの外に出る前に、彼らが持っていない(または持たないかもしれない)場合、ガベージコレクタは、サブスクリプションのあなたがそう必須処分、観察可能なサブスクリプションに.Dispose()
を呼び出すことはありませんが、自然に終わりました。
には、例えば、これを取る:
var wc = new WebClient();
var ds = Observable
.FromEventPattern<
DownloadStringCompletedEventHandler,
DownloadStringCompletedEventArgs>(
h => wc.DownloadStringCompleted += h,
h => wc.DownloadStringCompleted -= h);
var subscription =
ds.Subscribe(d =>
Console.WriteLine(d.EventArgs.Result));
ds
それが加入していると、観察完了またはサブスクリプションが破棄されたときにのみ取り外します場合にのみ、イベントハンドラに付着する観測可能。それはイベントハンドラであるため、オブザーバブルは、より多くのイベントを待っているため、決して完了しません。したがって、ディスポジションはイベントから切り離す唯一の方法です(上記の例の場合)。
あなたが知っているだけで、これまで一つの値を返すことに観察FromEventPattern
を持っている場合、イベントハンドラが自動的にデタッチした後、手動で処分する必要はありませんできるようにサブスクライブする前に、.Take(1)
拡張メソッドを追加するのが賢明ですサブスクリプションそのよう
:
var ds = Observable
.FromEventPattern<
DownloadStringCompletedEventHandler,
DownloadStringCompletedEventArgs>(
h => wc.DownloadStringCompleted += h,
h => wc.DownloadStringCompleted -= h)
.Take(1);
私はこのことができます願っています。
に配置されたオブジェクトがスコープ内にあるという事実は、それ悪いスタイルになり私見。何か不足していますか? –
これは、ディスポーザブル変数が有効範囲外になる前にmyObservableが起動した場合に、「使い捨て」変数を破棄できることを意味しますか?このオブジェクトを処分するより良いパターンは何ですか? – Noob