订阅 Observable.ToList() 未触发
Subscription to Observable.ToList() not firing
我从一个可枚举对象创建了一个可观察对象。
var enumerable = CreateMyVeryOwnEnumerable();
var obs = enumerable.ToObservable();
var observableOfList = obs.ToList();
observableOfList.Subscribe(o => Console.Write(o));
我遇到的问题是 Console.Write 从未被击中。
可能是什么问题?难道枚举永远不会结束?
在您的代码中:
如果 'CreateMyVeryOwnEnumerable' 创建一个非终止 IEnumerable,那么任何需要所有结果值的调用都将永远阻塞 - 如果您调用 ToList()、Min()、Max() 就会发生这种情况, Reverse() 等在 IEnumerable 上。
如果 'CreateMyVeryOwnEnumerable' 给出一个终止的 IEnumerable,则 Console.Write 调用被 List 实例命中;
修复
如果您的目标只是使用订阅消耗(打印)可枚举的每个值,那么您可以只使用:
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);
}
但是请注意,如果原始可枚举是非终止的,则订阅调用现在会阻塞。再多的密钥混合也不会关闭控制台 window。
如果您的目标是在订阅方法中实际使用 List,您别无选择,只能终止它。
我从一个可枚举对象创建了一个可观察对象。
var enumerable = CreateMyVeryOwnEnumerable();
var obs = enumerable.ToObservable();
var observableOfList = obs.ToList();
observableOfList.Subscribe(o => Console.Write(o));
我遇到的问题是 Console.Write 从未被击中。
可能是什么问题?难道枚举永远不会结束?
在您的代码中:
如果 'CreateMyVeryOwnEnumerable' 创建一个非终止 IEnumerable,那么任何需要所有结果值的调用都将永远阻塞 - 如果您调用 ToList()、Min()、Max() 就会发生这种情况, Reverse() 等在 IEnumerable 上。
如果 'CreateMyVeryOwnEnumerable' 给出一个终止的 IEnumerable,则 Console.Write 调用被 List 实例命中;
修复
如果您的目标只是使用订阅消耗(打印)可枚举的每个值,那么您可以只使用:
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);
}
但是请注意,如果原始可枚举是非终止的,则订阅调用现在会阻塞。再多的密钥混合也不会关闭控制台 window。
如果您的目标是在订阅方法中实际使用 List,您别无选择,只能终止它。