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

标签 c# .net system.reactive

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

相关文章:

c# - 在 ASP.NET MVC5 中求解二次方程

c# - 等待可观察完成

wpf - IObservable<T> 和 INotifyPropertyChanged - 是否存在连接

c# - 将应用程序依赖项部署到程序文件夹或 GAC

c# - 带有信用卡刷卡和打印机的 Windows 移动设备?

c# - Azure 服务总线客户端是否会自动重试从服务总线返回的暂时性错误?

java - Observable 中的 subcribeOn() io.reactivex.Scheduler 不能应用于 rx.Scheduler

c# - IsSelected == False 的 ListBox DataTrigger 在人口上触发?

c# - 音频的捕获和播放 (WP8.1 XAML)

C# 对象引用未设置为对象的实例。在列表中实例化类?