Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 可观测数据的取消令牌_C#_System.reactive - Fatal编程技术网

C# 可观测数据的取消令牌

C# 可观测数据的取消令牌,c#,system.reactive,C#,System.reactive,如果在开始按钮点击(即停止按钮)上创建以下可观察对象,我如何取消以下类型的Rx可观察对象 var instance = ThreadPoolScheduler.Instance; Observable.Interval(TimeSpan.FromSeconds(2), instance) .Subscribe(_ => { Console.WriteLine(D

如果在开始按钮点击(即停止按钮)上创建以下可观察对象,我如何取消以下类型的Rx可观察对象

var instance = ThreadPoolScheduler.Instance; 

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

您保留由
Subscribe
返回的
IDisposable
,并对其调用
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);
    }
}

只需使用
Subscribe
的一个重载,该重载接受
CancellationToken

observable.Subscribe(_ => Console.WriteLine(DateTime.UtcNow), cancellationToken);
这简化了Jon Skeet的示例:

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);
    }
}

答对 了我们有一个赢家,正是我所追求的,欢呼@JonI,就像你偷偷地取代了DateTime。现在是DateTime.UtcNow:)当我自己看到一个类似的问题时,我很困惑为什么微软不简单地让OnNext有一个返回类型的bool。这可能仅仅意味着是否继续。然后处理代码可以(如它认为合适的)在完成时返回false。很好,我没有看到。(当然,这两种方法都有效……我怀疑Subscribe重载只是以相同的方式调用register:)@jonsket是的,所有CancellationToken扩展方法都像您一样进行register Dispose。