问题标签 [weakeventmanager]

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 回答
1873 浏览

c# - 在 Windows.Forms 应用程序中使用 Wea​​kEventManager

当在 Windows.Forms 应用程序中使用此处描述的弱事件http://wekempf.spaces.live.com/blog/cns!D18C3EC06EA971CF!373.entry时,WeakEventManager 会泄漏 WeakReference 对象。我认为这是因为如果没有 WPF 消息循环,则永远不会执行 CleanupOperation,尽管在 WeakEventManager.ProtectedAddListener 中调用了 ScheduleCleanup。

作为一种解决方法,我实现了一个 Cleanup 函数,如下所示:

并在每次例如第 16 次调用ProtectedAddListener.

这行得通,但显然我喜欢避免这种(ab)使用反射。

所以我的问题是:

  1. 有没有办法使用公共/受保护的成员来实现清理功能?WeakEventManager.Purge 可能有用,但我不知道如何使用它。
  2. 有没有一种简单的方法可以在基于 Windows.Forms 的应用程序中运行 WPF 消息循环?
0 投票
2 回答
14727 浏览

.net - 使用 .NET 的 WeakEventManager 实现弱事件的示例

是否有使用 .NET 的WeakEventManager实现弱事件的示例?

我正在尝试按照文档中的“继承者说明”来实现它,但它是模糊的。例如,我无法弄清楚如何ProtectedAddListener从自定义管理器中的静态AddListener函数调用。

0 投票
1 回答
185 浏览

c# - 使用弱事件管理器时如何确定目标是否正在监听源

我在我的 WPF 应用程序中使用弱事件管理器将事件源连接到目标,使用 XXXEventManager.AddListener(source, this); 称呼。但是,我注意到我的代码有时会不止一次地连接同一个源和目标。这看起来会导致引发/处理实际上相同的多个事件(即每个连接一个事件)。是否可以通过询问 WeakEventManager(或向其添加功能)来确定目标是否已经连接到事件源,或者我是否必须在目标上实现我自己的列表?

此外,如果事件挂钩在源的生命周期内应该存在,那么调用 RemoveListener 的可接受方法是什么?我听说使用终结器不是一个好习惯,因为它会导致垃圾收集问题。这是准确的吗?

0 投票
1 回答
1013 浏览

.net - 我应该在监听 DependencyProperty 更改时使用弱事件监听器吗?

我在框架中寻找一个WeakEventManager的实现,它监听对 DependencyProperties 的更改。我发现唯一的弱属性更改事件侦听器PropertyChangedEventManager被设计用于实现 INotifyPropertyChanged 的​​类型,这让我有点困惑。

这是否意味着如果您听 DependencyProperty 进行更改

我不必担心通过事件注册保持活动状态的泄漏实例?

0 投票
1 回答
1032 浏览

c# - emddudley 的 WeakEventManager 的示例

我正在尝试将 Michael Dudley 的示例代码用于我自己的弱事件管理器实现:

使用 .NET 的 WeakEventManager 实现弱事件的示例

我想知道我将把我自己的处理程序的用户代码放在哪里?我看到这个:

我会用我自己的自定义代码替换那个表达式的内容吗?

谢谢,

凯文

0 投票
2 回答
826 浏览

wpf - WeakEventManager & DependencyPropertyChangedEventArgs

我想知道将 WeakEventManager(4.5 很好)与提供 DependencyPropertyChangedEventArgs 的事件一起使用的最佳方法是什么。这些不是从 EventArgs 派生的(出于性能原因),因此 WeakEventManager 不能开箱即用。

任何指南、链接或提示将不胜感激!

0 投票
1 回答
1581 浏览

c# - WeakEventManager 持有对订阅者的引用

我一直在使用 Wea​​kEventManager 来避免内存泄漏,并且我开始过度使用它们。例如,我为 INotifyPropertyChanged 创建了扩展方法,例如:

现在我很快意识到,这行不通。事实上,你不能真正使用匿名方法来处理弱事件。(如果我理解正确,那么编译器会为它创建一个“闭包类”(保存引用的值),它具有处理程序,但由于您的闭包类没有在任何地方引用,GC 会将其清除,并且事件处理程序不会被调用)

问题1:正确吗?我的意思是它是否正确,那么当对弱事件处理程序使用匿名方法(或 lambda)时,只有当 GC 没有同时运行时才会调用处理程序(例如,它是不确定的)?

好吧,我是这么想的,所以我做了一些单元测试以确保我做对了。在我进行以下单元测试之前,它似乎没问题:

问题#2:谁能解释我为什么这个测试失败了?

期望:这里我没有任何闭包(我把它们拿出来,以确保发生了什么),我只是有一个对象(闭包),它使用 Wea​​kEventManager 订阅一个事件,然后我删除对它的引用(闭包=空;)。

我期待 2 个 GC.Collect() 调用来清理我的旧闭包类,因此 WeakEventManager 将删除订阅者,而不运行处理程序,但测试失败。有任何想法吗?

编辑:对不起,通用参数不可见,现在它们是

0 投票
1 回答
2241 浏览

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

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

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

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

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

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

0 投票
1 回答
313 浏览

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

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

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

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

0 投票
1 回答
439 浏览

wpf - 在源对象上调用 PropertyChanged(null) 时多次调用 IWeakEventListener.ReceiveWeakEvent()

我在我的代码中使用PropertyObserver类来避免在PropertyChanged事件处理中进行字符串比较,并将处理 nullstring.Empty作为其参数的因素(这表明对象的所有属性都已更改)。

此类用于PropertyChangedEventManager在目标对象中注册回调,并实现IWeakEventListener每次PropertyChanged在源对象上调用事件时响应。

但是在创建单元测试的过程中,我发现它IWeakEventListener.ReceiveWeakEvent()被调用了 N 次,其中 N 是注册回调的数量。这仅在指定 null 或 string.Empty 时发生,而不是在 PropertyChanged 事件中给出有效属性名称时发生。

有谁知道为什么会发生这种情况以及如何解决?我的目标是在给出 null 时对已注册的处理程序进行一次 foreach,这样我就可以通过获取源对象的所有属性来更新我的目标对象。但是当ReceiveWeakEvent()被调用 N 次时,foreach 将被重复 N 次!

为了说明这一点,下面是 PropertyObserver 类和源类的简化版本(我使用 MVVM Light 的ObservableObject实现INotifyPropertyChanged):

在控制台应用程序的 Main 中,我们可以这样称呼它们: