将Sample(TimeSpan span)添加到Reactive Extensions管道会导致线程问题

安德鲁

通过使用Reactive Extensions,我创建了一个值的滚动缓冲区,该值在数据流中缓存了一小段最近值的历史记录,供绘图应用程序使用。由于这些值的到达速度比我感兴趣的显示速度快得多,因此我想在我的反应式管道中使用Sample(Timespan span)方法来减慢速度。但是,将其添加到下面的示例中会使WriteEnumerable方法中的某个位(集合被修改)之后引发Exception。显然,这是与Sample有关的线程问题,但是我对如何减轻它感到困惑。我尝试将计划程序设置为在Sample方法中使用无济于事。

有什么建议吗?

class Program
{
    static void Main(string[] args)
    {
        Observable.Interval(TimeSpan.FromSeconds(0.1))
            .Take(500)
            .TimedRollingBuffer(TimeSpan.FromSeconds(10))
            .Sample(TimeSpan.FromSeconds(0.5))
            .Subscribe(frame => WriteEnumerable(frame));

        var input = "";
        while (input != "exit")
        {
            input = Console.ReadLine();
        }
    }

    private static void WriteEnumerable<T>(IEnumerable<T> enumerable)
    {
        foreach (T thing in enumerable)
            Console.WriteLine(thing + " " + DateTime.UtcNow);

        Console.WriteLine(Environment.NewLine);
    }
}

public static class Extensions
{
    public static IObservable<IEnumerable<Timestamped<T>>> TimedRollingBuffer<T>(this IObservable<T> observable, TimeSpan timeRange)
    {
        return Observable.Create<IEnumerable<Timestamped<T>>>(
            o =>
            {
                var queue = new Queue<Timestamped<T>>();
                return observable.Timestamp().Subscribe(
                    tx =>
                    {
                        queue.Enqueue(tx);
                        DateTime now = DateTime.Now;
                        while (queue.Peek().Timestamp < now.Subtract(timeRange))
                            queue.Dequeue();

                        o.OnNext(queue);
                    },
                    ex => o.OnError(ex),
                    () => o.OnCompleted()
                    );
            });
    }
}

贷项到期的地方:被动扩展滑动时间窗口

詹姆斯世界

例外是由于您在枚举队列时正在修改队列。

RollingBuffer@Enigmativity引用实现是正确的事情-您将在他的实现中注意到OnNext,通过ToArray()确保列表的副本被分发给观察者而不是变异的原始对象来调用

在您的情况下,Sample引入并发引入(这很好-这是应该做的)-但是,您正在传递队列本身,由于引入的并发,在枚举发生时该队列会发生变化。这是一个错误。

在您的中TimedRollingBuffer,如果要使用o.OnNext(queue.ToArray())而不是,o.OnNext(queue)则不会有此问题。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将Facebook feed添加到网站会导致问题

来自分类Dev

将节点添加到列表的问题

来自分类Dev

将jQuery添加到HTML问题

来自分类Dev

将图像添加到 Openlayers 的问题

来自分类Dev

如何使用JavaScript将下拉列表添加到<span>

来自分类Dev

将<span>添加到Wordpress中的小部件标题

来自分类Dev

javascript:将html添加到<span>的末尾(noob)

来自分类Dev

使用Javascript将<span>标签添加到div

来自分类Dev

如何使用JavaScript将下拉列表添加到<span>

来自分类Dev

将角度添加到span元素类

来自分类Dev

将TimeSpan添加到DateTime不起作用

来自分类Dev

将TimeSpan添加到DateTime不起作用

来自分类Dev

将目录添加到PYTHONPATH也会导致我的主目录也被添加

来自分类Dev

将空列添加到postgres表中是否会导致锁定?

来自分类Dev

将Google Analytics(分析)添加到iOS应用会导致错误

来自分类Dev

将工具栏添加到活动会导致NoClassDefFoundError

来自分类Dev

将Jackson添加到POM会导致JsonProcessingException出现NoClassDefError

来自分类Dev

将小部件添加到第三页会导致框架调整大小

来自分类Dev

C#将字符串添加到列表视图中,会导致错误?

来自分类Dev

通过rbind将行添加到data.frame会导致日期错误

来自分类Dev

将元素添加到列表中是否会导致复制列表?

来自分类Dev

将库添加到IOS应用会导致可怕的构建失败

来自分类Dev

将<input>元素添加到<trigger>会导致服务启动崩溃?

来自分类Dev

将两个Sprite节点添加到父节点会导致应用崩溃

来自分类Dev

将图标添加到QT5会导致链接器错误

来自分类Dev

动态将子视图添加到单元格会导致布局约束错误输出

来自分类Dev

将节点添加到链表的开头会导致错误消息,我不关注

来自分类Dev

将多个 YoutubeFragment 添加到 View 会导致加载同一个视频

来自分类Dev

将 .removeStateDidListener 添加到 deinit 会导致应用程序崩溃

Related 相关文章

  1. 1

    将Facebook feed添加到网站会导致问题

  2. 2

    将节点添加到列表的问题

  3. 3

    将jQuery添加到HTML问题

  4. 4

    将图像添加到 Openlayers 的问题

  5. 5

    如何使用JavaScript将下拉列表添加到<span>

  6. 6

    将<span>添加到Wordpress中的小部件标题

  7. 7

    javascript:将html添加到<span>的末尾(noob)

  8. 8

    使用Javascript将<span>标签添加到div

  9. 9

    如何使用JavaScript将下拉列表添加到<span>

  10. 10

    将角度添加到span元素类

  11. 11

    将TimeSpan添加到DateTime不起作用

  12. 12

    将TimeSpan添加到DateTime不起作用

  13. 13

    将目录添加到PYTHONPATH也会导致我的主目录也被添加

  14. 14

    将空列添加到postgres表中是否会导致锁定?

  15. 15

    将Google Analytics(分析)添加到iOS应用会导致错误

  16. 16

    将工具栏添加到活动会导致NoClassDefFoundError

  17. 17

    将Jackson添加到POM会导致JsonProcessingException出现NoClassDefError

  18. 18

    将小部件添加到第三页会导致框架调整大小

  19. 19

    C#将字符串添加到列表视图中,会导致错误?

  20. 20

    通过rbind将行添加到data.frame会导致日期错误

  21. 21

    将元素添加到列表中是否会导致复制列表?

  22. 22

    将库添加到IOS应用会导致可怕的构建失败

  23. 23

    将<input>元素添加到<trigger>会导致服务启动崩溃?

  24. 24

    将两个Sprite节点添加到父节点会导致应用崩溃

  25. 25

    将图标添加到QT5会导致链接器错误

  26. 26

    动态将子视图添加到单元格会导致布局约束错误输出

  27. 27

    将节点添加到链表的开头会导致错误消息,我不关注

  28. 28

    将多个 YoutubeFragment 添加到 View 会导致加载同一个视频

  29. 29

    将 .removeStateDidListener 添加到 deinit 会导致应用程序崩溃

热门标签

归档