何时为可观察对象调用Dispose

时间:2013-09-23 06:30:44

标签: c# multithreading thread-safety system.reactive

我的项目中有很多代码,例如点击和静音,通过这种方式使用无效扩展

    IDisposable dsp = null;
    dsp = TargetObservable.Subscribe((incomingContent) =>
    {
        if (incomingContent == "something")
        {
            myList.Add(incomingContent);
            dsp.Dispose();
        }
    });

首先,我担心线程的安全性,因为我的Observable非常繁忙并且有很多内容一直在推动,但后来,我被告知我应该与ObserveOn(thread)结合以保证线程安全,我完全同意,所以让我们忘记线程安全的事情。

我想知道:

  1. 我应该如何或何时将Dispose称为可观察的。
  2. 满足点击和静音的正确方法是什么,结合一些完整的扩展方法,如Take(count),'TakeWhile(预测)'?
  3. 如果OnComplete()被调用,Dispose()将在内部调用,对吗?然后Observer和Observable之间的引用关系将中断(因为我的observable是一个长寿命的静态实例,引用会导致内存泄漏)。

1 个答案:

答案 0 :(得分:8)

我会避免遵循你在这里的模式。如果其他开发人员必须将全局状态与subscribe / OnNext处理程序的内部函数混合,则很难理解问题空间。

您最好创建封装序列终止的TakeWhile / TakeUntilIncluding扩展方法。然后,您可以将“添加到列表”的问题分开。

另一个要做的事情就是超级简单:

var subscription = source.Where(x => x=="something")
                         .Take(1)
                         .Subscribe(incomingContent=>myList.Add(incomingContent));