【发布时间】:2011-09-06 15:31:44
【问题描述】:
我想要做的是确保如果对我的观察者的唯一引用是可观察的,它会被垃圾收集并停止接收消息。
假设我有一个控件,上面有一个名为 Messages 的列表框,后面的代码如下:
//Short lived display of messages (only while the user's viewing incoming messages)
public partial class MessageDisplay : UserControl
{
public MessageDisplay()
{
InitializeComponent();
MySource.IncomingMessages.Subscribe(m => Messages.Items.Add(m));
}
}
哪个连接到这个源:
//Long lived location for message store
static class MySource
{
public readonly static IObservable<string> IncomingMessages = new ReplaySubject<string>;
}
我不希望消息显示在它不再可见后长时间保留在内存中。理想情况下,我想要一个小扩展,这样我就可以写了:
MySource.IncomingMessages.ToWeakObservable().Subscribe(m => Messages.Items.Add(m));
我也不想依赖 MessageDisplay 是一个用户控件这一事实,因为我稍后会想要使用 MessageDisplayViewModel 进行 MVVM 设置,这将不是用户控件。
【问题讨论】:
-
当您知道不再需要 Observable 时,您的代码中是否还有位置?在这种情况下,您可以获取从
Subscribe方法返回的IDisposable,以便在需要时将其删除。 -
@seldon 我可以在这个特定的例子中使用它,只要消息窗口关闭,但我想要一个更通用的方法,这样我可以更广泛地使用这个功能并防止其他程序员使用我的图书馆忘记在某处放置一些东西。我在 MVVMLightToolkit 中看到了一些相关的东西,但不适用于 IObservable,而且我并不真正了解它是如何工作的,而且众所周知,这些东西很难做好。
-
您可能指的是
WeakReference类,它可用于使垃圾收集器收集实例,即使它们被“引用”。然而,在响应式扩展中有很多操作符处理在某些时候处理 observable。如果当你知道你已经完成了 observable 时,你有一些事件等,也许这些就足够了? -
我建议您积极尝试采用反模式。正确完成的 MVVM 与 IDispose 模式一起工作得很好。你应该非常正确地实现这一点。
标签: c# garbage-collection system.reactive weak-references