EventLoopScheduler似乎停止执行预定的事件

时间:2016-09-02 21:26:15

标签: c# system.reactive

我创建了EventLoopScheduler,如此:

eventLoopScheduler = new EventLoopScheduler(ts =>
    new Thread(ts)
    {
        Name = "UpdatesEventLoop",
        IsBackground = true
    });

最重要的是我创建了一个调度程序:

updatesScheduler = eventLoopScheduler.Catch<Exception>(e =>
{
    Log.Error("Error on updates thread", e);
    return false;
});

现在,我有一个外部数据源,可以经常发布更新。我监听这些更新并将其传递,最终更新UI。它看起来像这样:

updatesObservable.Subscribe(x =>
{
    //Do some data checking then pass it along
    updatesScheduler.Schedule(() =>
    {
        //subject exists and is just a Subject of type "Update"
        subject.OnNext(theUpdate); 
    });
});

当我启动应用程序时,一切正常。更新流入并且updatesObservable获取它们,传递它们并且调度程序立即执行操作。

然而,有时会出现问题。更新的来源在一夜之间反弹,因此数据中断(我不确定这是我的问题的原因,但是当应用程序再次启动后重新连接到源)。当我早上回到办公室并查看应用程序时,GUI显示过时的数据,并且没有新的更新。

我附加了调试器,我可以看到updatesObservable正常从源获取更新并将它们传递给调度程序,但是,调度程序从未实际执行Action(在这种情况下{永远不会调用{1}}。

我无法弄清楚可能导致subject.OnNext(theUpdate)停止执行预定EventLoopScheduler的原因,因为我不太了解它的内部工作原因。

当我试图解决这个问题时,我查看了Actions。我注意到eventLoopScheduler字段(_evt)的SemaphoreSlim字段非常高CurrentCount并且不断增加。我将这个CurrentCount值与我在应用程序按预期运行时看到的值进行了比较,当一切正常时,CurrentCount徘徊在0-20左右,有时达到低点100但很快又回落到零。在破碎的状态下,CurrentCount达到100,000,并且永不减少。

有关这里可能发生的事情的任何建议吗? CurrentCount是否告诉我任何事情(不确定它代表什么)?是确认某些东西不能正常工作吗?

感谢。如果有任何不清楚的地方,请告诉我。

1 个答案:

答案 0 :(得分:0)

扩展我上面的评论,在我看来 - 而且我担心我还没有机会确认这一点 - 允许CatchScheduler抛出异常会导致EventLoopScheduler中的工作线程中止。由于异常不会延续到订阅者,因此订阅保持活动状态但EventLoopScheduler保持排队工作 - 因此增加了CurrentCount - 但是没有线程来处理已加入的项目。

你应该能够证明这一点: a)在异常处理程序中返回true并查看问题是否已解决(尽管在发生异常时您的订阅可能会被拆除), b)使EventLoopScheduler的工作线程前景(IsBackground = false)并查看应用程序是否崩溃,或者 c)删除调度程序上的Catch并改为使用Observable.Catch。

我假设用于Catch子句的调度程序的Catch扩展方法的作者是嵌套的,以便异常以与C#Catch块相同的方式流动,直到至少在块上处理异常但我觉得这种行为因为你遇到的原因很危险。

请告诉我这是否有帮助,因为我对CatchScheduler及其实施感兴趣。