哪里是实现弱和同步.NET委托的正确位置?

时间:2010-11-04 08:00:45

标签: .net delegates

在为代理实现弱引用和/或线程同步模式时,是否存在关于逻辑应该在何处实现的指南和/或反模式?

考虑到类 WindowA 想要订阅 DataB 上的事件,其中 DataB 是一个长期存在的实例,它是在许多(非UI线程)。

实施弱同步事件的选项包括:

  • 选项1:当 WindowA 将委托附加到 DataB 上的自定义事件时,cusom事件逻辑会检查SynchronizationContext.Current以查找调用线程,并存储这样,以便稍后,当引发事件时,可以通过SynchronizationContext调用委托。或者:

  • 选项2: WindowA 实现 ProxyC ,它充当 DataB 的目标。 ProxyC 上的目标方法实现同步和弱引用逻辑,并将调用转发到 WindowA 上的方法。 WindowA 可以进行垃圾回收,但是 ProxyC 必须在收集垃圾之前将其自身与所有事件分开。或者:

  • 选项3: WindowA 使用委托转换实用程序(如SharpObservation中的那些)使代理变弱并同步,然后将它们附加到 DataB上的事件< / em>的。 即:

    DataB.PropertyChanged + = new PropertyChangedEventHandler(WindowA.HandlePropertyChanged).MakeWeak()

首先......选项1是否有任何优点?虽然它是实现弱引用和同步逻辑的一个方便的地方,但它似乎打破了单一责任模式,迫使数据对象意识到同步和引用语义。

选项2看起来很干净。我喜欢它的各种方式,除了它涉及额外的工作,创建一个额外的类来处理弱引用。即便如此,除非代理知道如何删除定位它的代理,否则会出现内存泄漏。

选项3允许代理人自己承担同步和弱引用的责任,但有一个缺点是必须通过附加事件的代码调用实用程序方法。据我所知,大多数UI数据绑定技术不允许您控制数据绑定如何附加到 DataB 上的事件(因此选项1的实际值)。

大问题...... 这里有一个适合所有人的模式吗?是否存在单一的,优于其他的模式?

0 个答案:

没有答案