可观察

时间:2016-02-12 11:21:57

标签: c# system.reactive

如果在StartButton点击上创建了以下可观察对象,即如何从停止按钮创建,则如何取消以下类型的Rx Observable。

var instance = ThreadPoolScheduler.Instance; 

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

2 个答案:

答案 0 :(得分:12)

您保留IDisposable返回的Subscribe,并在其上调用Dispose

可能有一种方法可以将基于Rx IDisposable的取消订阅与CancellationToken开箱即用,但只需调用Dispose即可。 (您可以随时使用取消令牌注册续集来调用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);
    }
}

答案 1 :(得分:12)

只需使用带有Subscribe的{​​{1}}重叠之一:

CancellationToken

这简化了Jon Skeet的例子:

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