首页 > 解决方案 > 使用 2nd SubscribeOn 时 Rx.net 行为发生变化(可能违反隐式反应式合同)

问题描述

当我取消注释第二个订阅时,我试图了解不断变化的行为。

在这种情况下,我点击了抛出异常的行。

有人可以为我提供答案 - 如果这是预期的行为,为什么?

如果没有第二次订阅,则需要 30 多秒才能完成(这很好)。使用 - 它在运行 2 秒后出现异常情况。

    [TestMethod]
    public void AsyncObservable_NonReentrant()
    {
        int tester = 0;
        bool finished = false;
        Observable.Generate(
                0,
                i => i < 5,
                i => i+1,
                i => i,
                _ => TimeSpan.FromSeconds(1)
            )
            .SubscribeOn(ThreadPoolScheduler.Instance)
            .Finally(()=>finished = true)
            .Select(_ =>
            {
                Interlocked.Increment(ref tester);
                if (tester > 1)
                    throw new InvalidOperationException();
                return Observable
                       .Repeat(1, 5)
                       .Window(3)
                       .Finally(()=>Interlocked.Decrement(ref tester))
                       /*.SubscribeOn(ThreadPoolScheduler.Instance)*/;
            })
            .Concat()
            .Subscribe(__ =>
            {
                Thread.Sleep(3000);
            });
        while (!finished)
            Thread.Sleep(100);
    }

标签: system.reactiverx.net

解决方案


推荐阅读