我需要调用Dispose来释放Reactive Extensions (Rx)中的Subject<T>吗?

14
我正在直接使用反应式扩展(Rx)主题作为 C# 事件的替代,如下所示:
public class MyClass
{
    private Subject<string> subject;

    public IObservable<string> WhenSomethingHappened
    {
        get { return this.subject.AsObservable(); }
    }

    private void OnSomethingHappened(string something)
    {
        this.subject.OnNext(something);
    }
}

注意,我从未在主题上调用OnCompleted。MyClass 是否应该实现 IDisposable 并调用 this.subject.Dispose?这意味着使用 Subject 的任何实现都应该实现 IDisposable。
我之所以问这个问题是因为 IDisposable 模式有点像一种疾病,如果一个东西实现了它,使用它的一切都必须实现它。

1
MyClass和subject将在整个应用程序生命周期内“存在”?您想要从中取消订阅观察者吗? - vvv
在我的情况下是这样的。 - Muhammad Rehan Saeed
1个回答

21

不需要这么做。在担心内存使用和生命周期时,请考虑处理 订阅,而不是主题。


8
如果您查看Subject(https://github.com/Reactive-Extensions/Rx.NET/blob/master/Rx.NET/Source/System.Reactive.Linq/Reactive/Subjects/Subject.cs)的源代码,您会发现它所做的就是用DisposedObserver实例替换任何观察者。如果将任何事件抛到主题中,则会引发此实例。因此,从技术上讲,我认为它将释放对所有观察者的引用,但如上所述,应该通过取消订阅来完成这项工作。 - Lee Campbell
3
好的回答和评论。每个人都有一个赞。如果您已经实现了IDisposable,怎么办?似乎有很多对象实现了IDisposable,但建议不要将它们释放。新的HttpClient就是另一个例子。 - Muhammad Rehan Saeed
@LeeCampbell 链接已损坏。 - Yitzchak
@MuhammadRehanSaeed 任务是另一个例子。 - Yitzchak
3
@Yitzchak,我已经搜索到了主题源代码的当前链接,这是链接:https://github.com/dotnet/reactive/blob/master/Rx.NET/Source/src/System.Reactive/Subjects/Subject.cs#L279。上面的评论是5年前的。 - Lee Campbell
3
如果这是真的,那么为什么Subjects要实现IDisposable接口呢? - Chase Florell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接