2016-02-12 22 views
5

StartButtonクリック、つまり停止ボタンで次のような観察可能オブジェクトが作成されている場合は、どのようにしてRx Observableのタイプを取り消すことができますか?可観測トークンのキャンセルトークン

var instance = ThreadPoolScheduler.Instance; 

Observable.Interval(TimeSpan.FromSeconds(2), instance) 
        .Subscribe(_ => 
        { 
        Console.WriteLine(DateTime.Now); // dummy event 
        } 
        );   

答えて

10

ちょうど取るSubscribeのオーバーロードのいずれかを使用します。

はここで証明するために、短いながら完全な例です(あなたはいつもちょうど...処分呼び出すためにキャンセルトークンで継続を登録することができ) CancellationToken

observable.Subscribe(_ => Console.WriteLine(DateTime.UtcNow), cancellationToken); 

これはジョンスキートの例を簡素化:

using System; 
using System.Reactive.Concurrency; 
using System.Reactive.Linq; 
using System.Threading; 

class Program 
{ 
    static void Main(string[] args) 
    { 
     var instance = ThreadPoolScheduler.Instance; 
     var cts = new CancellationTokenSource(TimeSpan.FromSeconds(5)); 

     Observable.Interval(TimeSpan.FromSeconds(0.5), instance) 
      .Subscribe(_ => Console.WriteLine(DateTime.UtcNow), cts.Token); 
     Thread.Sleep(10000); 
    } 
} 
+0

ニース、それを見ていない。 (どちらもうまくいきますが...私は、購読が同じ方法で登録レジスタをオーバーロードすると思っています:) –

+0

@JonSkeetはい、CancellationTokenの拡張メソッドはすべてあなたがしたようにDisposeを登録します。 –

9

あなたはSubscribeによって返されたIDisposableを保持し、それにDisposeを呼び出します。

ありも箱から出してCancellationTokenとRxのIDisposableベースの退会を統合する方法かもしれませんが、ちょうどDisposeを呼び出すと、スタートになります。

using System; 
using System.Reactive.Concurrency; 
using System.Reactive.Linq; 
using System.Threading; 

class Program 
{ 
    static void Main(string[] args) 
    { 
     var instance = ThreadPoolScheduler.Instance; 
     var cts = new CancellationTokenSource(TimeSpan.FromSeconds(5)); 

     var disposable = Observable 
      .Interval(TimeSpan.FromSeconds(0.5), instance) 
      .Subscribe(_ => Console.WriteLine(DateTime.UtcNow)); 
     cts.Token.Register(() => disposable.Dispose()); 
     Thread.Sleep(10000); 
    } 
} 
+0

ビンゴ!私たちは勝者を持っています。私は喜んだ@Jon – Mdev

+0

私は、あなたが秘密にDateTime.NowをDateTime.UtcNowに置き換えたのを好きです。 –

+0

私は同様の質問を自分自身で見ると、なぜMicrosoftが単純にOnNextはboolの戻り値の型を持ちます。それは単に継続するかどうかを意味する可能性があります。その後、処理コードは(それが収まると見て)、完了したらfalseを返すことができます。 – Hugh

関連する問題