何时为可观察对象调用Dispose

Sha*_*awn 0 c# multithreading thread-safety system.reactive

我的项目中有很多代码,如Hit和静音,通过这种方式使用Reactive扩展:

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

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

在这里,我想知道:

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

Lee*_*ell 8

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

你最好创建封装序列终止的TakeWhile/ TakeUntilIncludingextension方法.然后,您可以将"添加到列表"中的问题分开.

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

var subscription = source.Where(x => x=="something")
                         .Take(1)
                         .Subscribe(incomingContent=>myList.Add(incomingContent));
Run Code Online (Sandbox Code Playgroud)