Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.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# 如何开始评估冷态IObservable_C#_System.reactive_Observable - Fatal编程技术网

C# 如何开始评估冷态IObservable

C# 如何开始评估冷态IObservable,c#,system.reactive,observable,C#,System.reactive,Observable,我想,冷的iobservable,比如从Observable.Create返回的iobservable,会在订阅时进行评估。我订阅了。IObservable未进行评估 class Program { static IObservable<int> HotSource() { return Observable.Generate<int, int>(0, x => x <= 100, x => x + 1, x =>

我想,冷的iobservable,比如从
Observable.Create
返回的iobservable,会在订阅时进行评估。我订阅了。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();
    }
}
类程序
{
静态IObservable热源()
{
生成(0,x=>x+1,x=>x);
}
静态IObservable ColdSource()
{
返回可观察的。创建(订阅服务器=>()=>
{

对于(int i=0;i您的创建方法已关闭。这将起作用:

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

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

你说的“未评估”到底是什么意思?你看到了什么?如果你删除
Take
调用,会有什么变化吗?(感谢完整的示例-我会在可能的时候运行它。)我看到了
HotSource
中打印的数字(当我取消对
HotSource
的调用时,它消失了)。当我在
ColdSource
中设置一个操作断点时,它不会触发。
Take
只是减少了
HotSource
中的数字量,这并不是真的需要。
HotSource()
实际上返回了一个cold
IObservable
,因为只有在订阅时才会生成值。如果您从create返回一个
IDisposable
,请确保使用
subscriber.OnCompleted()
,另一个选项是不返回
IDisposable
,而
Create
的重载将自动调用
OnCompleted()
。已添加OnCompleted。谢谢。现在已添加OnCompleted:)更改不会第一次出现。
    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();
    }