gpt4 book ai didi

c# - 循环推送值列表的 Observable

转载 作者:行者123 更新时间:2023-11-30 19:04:56 24 4
gpt4 key购买 nike

我想创建一个 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com