如果在StartButton点击上创建了以下可观察对象,即如何从停止按钮创建,则如何取消以下类型的Rx Observable。
var instance = ThreadPoolScheduler.Instance;
Observable.Interval(TimeSpan.FromSeconds(2), instance)
.Subscribe(_ =>
{
Console.WriteLine(DateTime.Now); // dummy event
}
);
答案 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);