我想创建一个 Observable,它每隔 t
秒就会推送一个值列表。
例如,给定 {1, 2, 3, 4} 订阅者应该得到这个:
1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2...
class Program
{
static void Main()
{
var observable = Observable
.Interval(TimeSpan.FromSeconds(3))
.Zip(Observable.Range(1, 4)
.Repeat(), (_, count) => count);
observable.Subscribe(Console.WriteLine);
Console.WriteLine("Finished!");
}
}
我已经研究过这个例子,它似乎可以工作,但是有一个非常讨厌的问题:Main 方法永远不会结束它的执行!为什么? :(
更糟糕的是,几分钟后,此控制台应用程序抛出
OutOfMemoryException
!
最佳答案
这对我来说似乎是一个简单的错误放置的 .Repeat()
。
class Program
{
static void Main()
{
var observable = Observable
.Interval(TimeSpan.FromSeconds(3))
.Zip(Observable.Range(1, 4), (_, count) => count)
.Repeat();
observable.Subscribe(Console.WriteLine);
Console.WriteLine("Finished!");
Console.ReadLine();
}
}
现在将:
- 不阻止控制台完成
- 不抛出 OutOfMemoryException。
请注意,没有使用 .Do()
,没有自定义扩展方法,没有无限产生阻塞线程的 IEnumerables ;-)
...还有一个没有 Zip
的替代实现,希望外行开发人员可以阅读和理解(也可以处理!):
class Program
{
static void Main()
{
var observable = Observable
.Interval(TimeSpan.FromSeconds(3))
//.Zip(Observable.Range(1, 4), (_, count) => count)
.Select(i=>i+1)
.Take(4)
.Repeat();
using (observable.Subscribe(Console.WriteLine))
{
Console.WriteLine("Running...");
Console.ReadLine();
}
Console.WriteLine("Finished!");
}
}
关于c# - 循环推送值列表的 Observable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34850781/