2
在Windows.Forms应用程序中使用这里所述http://wekempf.spaces.live.com/blog/cns!D18C3EC06EA971CF!373.entry的弱事件时,WeakEventManager会泄漏WeakReference对象。 我认为这是因为没有WPF消息循环,CleanupOperation从不执行,虽然ScheduleCleanup在WeakEventManager.ProtectedAddListener中调用。在Windows.Forms中使用WeakEventManager应用程序
作为一种变通方法我实现了一个清理功能,像这样:
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)使用反射。
所以我的问题是:
- 有实现使用公共/ protected成员清理功能的方法吗? WeakEventManager.Purge可能很有用,但我不知道如何使用它。
- 是否有一种简单的方法在基于Windows.Forms的应用程序中运行WPF消息循环?
+1对于一个有趣的答案,虽然性能不是我主要关心的地方。我非常感谢一个不依赖无证私人函数的解决方案。 – Henrik 2011-02-24 15:48:25