当在 Windows.Forms 应用程序中使用此处描述的弱事件http://wekempf.spaces.live.com/blog/cns!D18C3EC06EA971CF!373.entry时,WeakEventManager 会泄漏 WeakReference 对象。我认为这是因为如果没有 WPF 消息循环,则永远不会执行 CleanupOperation,尽管在 WeakEventManager.ProtectedAddListener 中调用了 ScheduleCleanup。
作为一种解决方法,我实现了一个 Cleanup 函数,如下所示:
internal bool Cleanup()
{
// The following is equivalent to
// return this.Table.Purge(false);
// but we need to use reflection to access the private members.
PropertyInfo pi = typeof(WeakEventManager).GetProperty("Table", BindingFlags.Instance | BindingFlags.NonPublic);
if (pi == null)
return false;
object table = pi.GetValue(this, null);
MethodInfo mi = table.GetType().GetMethod("Purge", BindingFlags.Instance | BindingFlags.NonPublic);
if (mi == null)
return false;
return (bool)mi.Invoke(table, new object[] { false });
}
并在每次例如第 16 次调用ProtectedAddListener
.
这行得通,但显然我喜欢避免这种(ab)使用反射。
所以我的问题是:
- 有没有办法使用公共/受保护的成员来实现清理功能?WeakEventManager.Purge 可能有用,但我不知道如何使用它。
- 有没有一种简单的方法可以在基于 Windows.Forms 的应用程序中运行 WPF 消息循环?