问题标签 [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.
c# - 在 Windows.Forms 应用程序中使用 WeakEventManager
当在 Windows.Forms 应用程序中使用此处描述的弱事件http://wekempf.spaces.live.com/blog/cns!D18C3EC06EA971CF!373.entry时,WeakEventManager 会泄漏 WeakReference 对象。我认为这是因为如果没有 WPF 消息循环,则永远不会执行 CleanupOperation,尽管在 WeakEventManager.ProtectedAddListener 中调用了 ScheduleCleanup。
作为一种解决方法,我实现了一个 Cleanup 函数,如下所示:
并在每次例如第 16 次调用ProtectedAddListener
.
这行得通,但显然我喜欢避免这种(ab)使用反射。
所以我的问题是:
- 有没有办法使用公共/受保护的成员来实现清理功能?WeakEventManager.Purge 可能有用,但我不知道如何使用它。
- 有没有一种简单的方法可以在基于 Windows.Forms 的应用程序中运行 WPF 消息循环?
.net - 使用 .NET 的 WeakEventManager 实现弱事件的示例
是否有使用 .NET 的WeakEventManager实现弱事件的示例?
我正在尝试按照文档中的“继承者说明”来实现它,但它是模糊的。例如,我无法弄清楚如何ProtectedAddListener
从自定义管理器中的静态AddListener
函数调用。
c# - 使用弱事件管理器时如何确定目标是否正在监听源
我在我的 WPF 应用程序中使用弱事件管理器将事件源连接到目标,使用 XXXEventManager.AddListener(source, this); 称呼。但是,我注意到我的代码有时会不止一次地连接同一个源和目标。这看起来会导致引发/处理实际上相同的多个事件(即每个连接一个事件)。是否可以通过询问 WeakEventManager(或向其添加功能)来确定目标是否已经连接到事件源,或者我是否必须在目标上实现我自己的列表?
此外,如果事件挂钩在源的生命周期内应该存在,那么调用 RemoveListener 的可接受方法是什么?我听说使用终结器不是一个好习惯,因为它会导致垃圾收集问题。这是准确的吗?
.net - 我应该在监听 DependencyProperty 更改时使用弱事件监听器吗?
我在框架中寻找一个WeakEventManager的实现,它监听对 DependencyProperties 的更改。我发现唯一的弱属性更改事件侦听器PropertyChangedEventManager被设计用于实现 INotifyPropertyChanged 的类型,这让我有点困惑。
这是否意味着如果您听 DependencyProperty 进行更改
我不必担心通过事件注册保持活动状态的泄漏实例?
c# - emddudley 的 WeakEventManager 的示例
我正在尝试将 Michael Dudley 的示例代码用于我自己的弱事件管理器实现:
使用 .NET 的 WeakEventManager 实现弱事件的示例
我想知道我将把我自己的处理程序的用户代码放在哪里?我看到这个:
我会用我自己的自定义代码替换那个表达式的内容吗?
谢谢,
凯文
wpf - WeakEventManager & DependencyPropertyChangedEventArgs
我想知道将 WeakEventManager(4.5 很好)与提供 DependencyPropertyChangedEventArgs 的事件一起使用的最佳方法是什么。这些不是从 EventArgs 派生的(出于性能原因),因此 WeakEventManager 不能开箱即用。
任何指南、链接或提示将不胜感激!
c# - WeakEventManager 持有对订阅者的引用
我一直在使用 WeakEventManager 来避免内存泄漏,并且我开始过度使用它们。例如,我为 INotifyPropertyChanged 创建了扩展方法,例如:
现在我很快意识到,这行不通。事实上,你不能真正使用匿名方法来处理弱事件。(如果我理解正确,那么编译器会为它创建一个“闭包类”(保存引用的值),它具有处理程序,但由于您的闭包类没有在任何地方引用,GC 会将其清除,并且事件处理程序不会被调用)
问题1:正确吗?我的意思是它是否正确,那么当对弱事件处理程序使用匿名方法(或 lambda)时,只有当 GC 没有同时运行时才会调用处理程序(例如,它是不确定的)?
好吧,我是这么想的,所以我做了一些单元测试以确保我做对了。在我进行以下单元测试之前,它似乎没问题:
问题#2:谁能解释我为什么这个测试失败了?
期望:这里我没有任何闭包(我把它们拿出来,以确保发生了什么),我只是有一个对象(闭包),它使用 WeakEventManager 订阅一个事件,然后我删除对它的引用(闭包=空;)。
我期待 2 个 GC.Collect() 调用来清理我的旧闭包类,因此 WeakEventManager 将删除订阅者,而不运行处理程序,但测试失败。有任何想法吗?
编辑:对不起,通用参数不可见,现在它们是
c# - 为什么当发送者不是名义上的时候 WeakEventManager 不会触发事件?
我不喜欢非标准模式,但我正在对我的应用程序进行快速测试,并且遇到了这种奇怪的行为。
考虑一个公开事件的普通类,这里是非常常见的 PropertyChanged,但我认为可以是任何其他的。
订阅者选择通过 WeakEventManager 助手订阅事件。现在,“奇怪”的事情是实际的发件人引用:只要实例与订阅上使用的实例相同,一切都会好起来的。但是,当您使用另一个对象时,不会发出任何通知。
同样,这不是一个好的模式,但我想知道这个限制是否有任何好的理由,或者更确切地说这是一个错误。与其说是真正的需要,不如说是一种好奇。
编辑:这是实现预期行为的粗略方法(为简单起见,硬链接)。
c# - C# 是否可以将弱事件模式与静态类一起使用?
我有一个我正在使用的静态类,因为我不喜欢传递一个巨大的设置文件的想法,但是我希望能够让实例订阅静态类上的静态事件。
我正在研究使用 PropertyChangedEventManager 的 AddListener 方法,但它需要一个实例来添加。
这甚至可能吗?我在.net 4.0上,以防万一。
wpf - 在源对象上调用 PropertyChanged(null) 时多次调用 IWeakEventListener.ReceiveWeakEvent()
我在我的代码中使用PropertyObserver类来避免在PropertyChanged
事件处理中进行字符串比较,并将处理 null
或string.Empty
作为其参数的因素(这表明对象的所有属性都已更改)。
此类用于PropertyChangedEventManager
在目标对象中注册回调,并实现IWeakEventListener
每次PropertyChanged
在源对象上调用事件时响应。
但是在创建单元测试的过程中,我发现它IWeakEventListener.ReceiveWeakEvent()
被调用了 N 次,其中 N 是注册回调的数量。这仅在指定 null 或 string.Empty 时发生,而不是在 PropertyChanged 事件中给出有效属性名称时发生。
有谁知道为什么会发生这种情况以及如何解决?我的目标是在给出 null 时对已注册的处理程序进行一次 foreach,这样我就可以通过获取源对象的所有属性来更新我的目标对象。但是当ReceiveWeakEvent()
被调用 N 次时,foreach 将被重复 N 次!
为了说明这一点,下面是 PropertyObserver 类和源类的简化版本(我使用 MVVM Light 的ObservableObject
实现INotifyPropertyChanged
):
在控制台应用程序的 Main 中,我们可以这样称呼它们: