LoginSignup
7
6

More than 5 years have passed since last update.

[C#][ReactiveExtensions] CompositeDisposableを再利用したい(DisposeではなくClearを使う)

Posted at

TL;DR

タイトルでもうすでに完結してるんですが・・・、DisposeではなくClearを使えばよかったというメモ。

背景

CompositeDisposableは一度でもDispose呼んじゃうと、その後にAddしても追加したそばからDisposeが呼ばれて破棄されるようになってしまいます。というかそういう仕様です。

それを知らずに使ってて、ReactivePropertyのSubscribeが2回目以降に効かなくなって困るという状態でした。
なのでDispose後に再度CompositeDisposableをnewするというイマイチな実装にしてました・・・。

CompositeDisposable.Add Method (System.Reactive.Disposables)

Addは以下のような仕様です。CompositeDisposable自体がdisposeされると、その後のAddされたものは都度disposeされるようになるようです。

Adds a disposable to the CompositeDisposable or disposes the disposable if the CompositeDisposable is disposed.

CompositeDisposable.Clear Method (System.Reactive.Disposables)

Clearなら登録されているものを全てdisposeしますが、CompositeDisposable自体はdisposeしません。なのでそのまま継続利用できます。

Removes and disposes all disposables from the GroupDisposable, but does not dispose the CompositeDisposable.

CompositeDisposable.Remove Method (System.Reactive.Disposables)

Removeも削除時に対象のdisposeを呼ぶ仕様なので、場合によってはRemoveを利用してもよいかと思います。

Removes and disposes the first occurrence of a disposable from the CompositeDisposable.

結論

再利用したい場合はDisposeではなく、Clear or Remove を使いましょう。
(サンプルコードがDipose呼んでるものばかりなので、CompositeDisposableは再利用できないものと勘違いしていました)

参考

CompositeDisposable Class (System.Reactive.Disposables)

この記事を書いてる途中まで、以下の記事(RxJava)のようにReusableCompositeDisposableを定義しないといけないのかなと思ってました・・・。
CompositeSubscriptionは再利用できない #RxJava - Islands in the byte stream

7
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
6