问题标签 [weak-events]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
375 浏览

wpf - 为什么在控件上使用弱事件模式而不是在其他地方管理生命周期?

我了解弱引用和弱事件模式。

使用弱事件模式的一个地方是在控件和数据模型之间的数据绑定中。在DataBinding过程中,如果DataModel支持INotifyPropertyChange,Control会通过事件请求DataModel通知他改变。如果没有弱事件,DataModel 将在控件上保留一个硬引用。由于该引用,无法在窗口变为可用于 GC 的同时将控件标记为可用于 GC。

微软决定使用弱引用来解决这个问题。

我想知道像提议的其他替代方案是否会更好?

替代方案:使用传递其子 UiElements 的代码在 Window 上实现 IDisposable 以要求他们将其 DataBinding 删除到 DataModel ?该解决方案有什么问题?

0 投票
0 回答
134 浏览

.net - Can anyone explain me why there's no WeakDelegate in .NET?

I see no architectural constraints for implementing this entity. .NET 4.5 does not have it, and WeakEventManager is still in the game.

I don't think guys in MS are lazy or stupid, so I suspect myself missing something very important. But what?...

0 投票
2 回答
1211 浏览

c# - 带有事件名称 lambda 表达式和自定义事件访问器的 WeakEventManager

我一直在寻找使用弱事件模式订阅事件。使用 .NET 4.5 框架,我们有一个看起来很漂亮的WeakEventManager类。弱订阅事件就像

但是,我不是“字符串类型”代码的忠实拥护者。我一直在尝试找到一种方法来使用要订阅的事件的字符串名称。我发现获取事件名称的唯一方法是在定义事件的类中使用 lambda 表达式。在我的场景中,我拥有定义事件的类,因此我可以随意更改它。我一直在尝试找到一种干净的方式来订阅和取消订阅我的活动,这是我最不喜欢的。

Using custom event accessors I was able to avoid clunky (in my opinion) methods like LoggingOn_Subscribe(EventHandler) or adding name properties for each event. Unfortunately it is not so intuitive in that people subscribing to the event are doing so in the classic manner but have no idea other than the "_Weak" part of the name that indicates it is being subscribed to weakly.

As for my questions..

1) I have never used weak events or custom event accessors before. The code above appears to work, however, I would just like to make sure there is nothing technically wrong with it. Is there anything I'm doing here to shoot myself in the foot?

2) From a design perspective, is this a terrible idea? Are there any major design concerns I should consider? Is there better alternative? Should i just suck it up and subscribe from my subscriber using a stringly-typed event name?

Thoughts?

0 投票
1 回答
2532 浏览

c# - 使用 WPF 4.5 通用弱事件管理器处理路由事件?

我想知道如何将“已处理”RoutedEvents 的订阅转换为 WeakEventManager?

UIElement 具有以下订阅“已处理”RoutedEvents 的方法: UIElement.AddHandler(RoutedEvent routedEvent, Delegate handler, boolhandledEventsToo)

那么如何将其转换为 Generic WeakEventManager 表单呢?

0 投票
1 回答
102 浏览

c# - C# 使用弱引用监听 3rd 方长寿事件

我正在附加到第 3 方,长期存在的 Deleted 事件发布者,由于事件处理程序,它最终使我可能短暂存在的对象保持活动状态。Deleted 事件很可能永远不会触发,如果是,我只需要处理。取消订阅 Deleted 事件的位置并不明显,因此我希望对它进行弱引用,以便我的对象可以被 GC 处理。

我已经看到了很多非常精细的方法来创建弱事件处理程序,但是下面的代码片段似乎可以解决问题,至少在提供的测试代码片段中是这样。这只是疯了还是可以工作?

http://diditwith.net/CommentView,guid,aacdb8ae-7baa-4423-a953-c18c1c7940ab.aspx在“A First Stab”下说类似的片段“(...)不够健壮,无法与一个事件(...)”,为什么不呢?)

测试班

0 投票
1 回答
2241 浏览

c# - 为什么当发送者不是名义上的时候 WeakEventManager 不会触发事件?

我不喜欢非标准模式,但我正在对我的应用程序进行快速测试,并且遇到了这种奇怪的行为。

考虑一个公开事件的普通类,这里是非常常见的 PropertyChanged,但我认为可以是任何其他的。

订阅者选择通过 WeakEventManager 助手订阅事件。现在,“奇怪”的事情是实际的发件人引用:只要实例与订阅上使用的实例相同,一切都会好起来的。但是,当您使用另一个对象时,不会发出任何通知。

同样,这不是一个好的模式,但我想知道这个限制是否有任何好的理由,或者更确切地说这是一个错误。与其说是真正的需要,不如说是一种好奇。

编辑:这是实现预期行为的粗略方法(为简单起见,硬链接)。

0 投票
1 回答
313 浏览

c# - C# 是否可以将弱事件模式与静态类一起使用?

我有一个我正在使用的静态类,因为我不喜欢传递一个巨大的设置文件的想法,但是我希望能够让实例订阅静态类上的静态事件。

我正在研究使用 PropertyChangedEventManager 的 AddListener 方法,但它需要一个实例来添加。

这甚至可能吗?我在.net 4.0上,以防万一。

0 投票
1 回答
831 浏览

c# - CollectionChangedEventManager 不转发自定义集合的事件

我有一个自定义INotifyCollectionChanged类,它基本上只是围绕标准ObservableCollection。每当添加/删除某些内容时,CollectionChanged都会按预期引发事件。但是,当我尝试使用 a 收听此事件时WeakEventListener,侦听器永远不会收到该事件。为什么会发生这种情况,我该如何解决?

在下面的示例中,我希望 aNotImplementedException被抛出,但测试用例成功(这清楚地表明事件确实被引发了)。如果将集合更改为ObservableCollectiona 而不是 a Wrapper,则会按预期抛出异常。

可能相关但仍未得到答复:
为什么当发件人不是名义上的时 WeakEventManager 不触发事件?

0 投票
0 回答
823 浏览

c# - 为共享属性 MVVM 实现弱事件模式的正确方法

我正在准备一个包含多个对象的应用程序,每个对象都有一个整数 id 和字符串数据。我希望具有相同 id 的对象的数据相同。我将把这个对象称为 SharedObject (这个对象就像一些数据库表的 ViewModel)。

有人可能会说这很容易。您可以创建单个对象并在每次需要时引用它。但实际上这种方式对我不起作用,因为我无法预测创建对象的时间和地点。

因此,为了解决这个问题,我决定在 SharedObject 类中放置一个静态事件,并在任何 SharedObject 数据发生更改时调用它(例如 INotifyPropertyChanged 中的 PropertyChanged 事件,但我的是静态的。这将使它对 SharedObject 的每个实例可见),但是问题是我最终得到了一个充满内存泄漏的程序!

昨晚整理了一下,不得不使用弱事件模式来解决内存泄漏问题。

我昨晚在网上搜索了弱事件模式的完整实现,但最终我什么也没有或删除了页面。

最后我想出了如何使用弱事件模式来做到这一点,并创建了一个测试项目来测试这种方法,但它不起作用,无法调用 ReceiveWeakEvent 事件。

我错过了什么吗?或者实现这种模式的正确方法是什么?

顺便说一句,我正在使用 .net 4,因为我需要我的应用程序支持 Win XP(这是我的客户需要的,不要问我),所以我不能使用通用的 WeakEventManager 类。

很抱歉发了这么长的帖子,但这个问题让我把头发扯掉了,在此先感谢。

这是完整的应用程序代码:

共享对象类:

WaekEvent 和 SharedWeakEventManager 类:

MainWindow 的 XAML 部分:

主窗口类:

0 投票
1 回答
124 浏览

c# - 弱事件和GC

当我无法确定地取消订阅时,我正在使用弱事件(否则我更喜欢+=-=不是弱事件):

这样,如果对象被垃圾收集,则不会调用事件处理程序。完美的。

然而。如果对象还没有被垃圾回收(但是没有更多的强引用),那么事件处理程序仍然会被调用。

我的问题比较笼统:使用弱事件时应该怎么做?使用弱事件时,我应该期待事件处理程序中的无效调用吗?还是我应该强制 GC避免这种情况(某种确定性的“清理”)?还有什么?