订阅Observable.ToList()没有触发

时间:2016-05-06 12:30:51

标签: c# .net ienumerable system.reactive

我已经从可枚举中创建了一个observable。

var enumerable = CreateMyVeryOwnEnumerable();
var obs = enumerable.ToObservable();
var observableOfList = obs.ToList();

observableOfList.Subscribe(o => Console.Write(o));

我遇到的问题是Console.Write永远不会被命中。

可能是什么问题?可能是可枚举永远不会结束吗?

1 个答案:

答案 0 :(得分:1)

在您的代码中:

如果'CreateMyVeryOwnEnumerable'创建了一个非终止的IEnumerable,那么任何完全需要所有结果值的调用将永远阻塞 - 如果你调用ToList(),Min(),Max(),Reverse()会发生这种情况IEnumerable上的等等。

如果'CreateMyVeryOwnEnumerable'给出终止IEnumerable,则使用List实例命中Console.Write调用;

修复

如果你的目标是使用Subscribe只消耗(打印)可枚举的每个值,那么你可以使用:

   static void Main()
    {
        var enumerable = CreateMyVeryOwnEnumerable();
        var obs = enumerable.ToObservable();

        obs.Subscribe(o => Console.WriteLine(o));

        Console.ReadKey();
    }

    static IEnumerable<int> CreateMyVeryOwnEnumerable()
    {
        // non-terminating
        while (true)
            yield return 0;

        // terminating
        //return Enumerable.Range(0, 100);
    }

但请注意,如果原始枚举是非终止的,则Subscribe调用现在会阻止。没有任何关键的糖化将关闭控制台窗口。

如果您的目标是在订阅方法中实际使用List,那么您别无选择,只能终止它。