如何开始评估冷 IObservable



我想,每当订阅它们时,都会评估冷的IObservables,就像从Observable.Create返回的那个一样。我订阅了。IObservable 未评估。

class Program
{
    static IObservable<int> HotSource()
    {
        return Observable.Generate<int, int>(0, x => x <= 100, x => x + 1, x => x);
    }
    static IObservable<int> ColdSource()
    {
        return Observable.Create<int>(subscriber => () =>
        {
            for (int i = 0; i <= 100; ++i)
            {
                subscriber.OnNext(i);
            }
        });
    }
    static void Process(IObservable<int> numbers)
    {
        numbers
            .Take(15)
            .Subscribe(Console.WriteLine);
    }
    static void Main(string[] args)
    {
        Console.WriteLine("Hot");
        Process(HotSource());
        Console.WriteLine("Cold");
        Process(ColdSource());
        Console.WriteLine("End");
        Console.ReadLine();
    }
}

创建方法已关闭。这将起作用:

    static IObservable<int> ColdSource()
    {
        return Observable.Create<int>(subscriber =>
        {
            for (int i = 0; i <= 100; ++i)
            {
                subscriber.OnNext(i);
            }
            subscriber.OnCompleted();
            return Disposable.Empty;
        });
    }

按照您编写它的方式,您正在返回一个在取消订阅时发生的Action。您希望代码在订阅时发生。

顺便说一下,你的"热"可观察量不是很热。我不知道这对你是否有影响。您可以在此代码中看到:

    static void Main(string[] args)
    {
        Console.WriteLine("Hot 1");
        var hotSource = HotSource();
        Process(hotSource);
        Thread.Sleep(TimeSpan.FromSeconds(2));
        Console.WriteLine("Hot 2");
        Process(hotSource);
        Console.ReadLine();
    }

如果hotSource真的很热,每个数字只会打印一次,或者它们会同时打印(1、1、2、2 等)。

相关内容

  • 没有找到相关文章

最新更新