2009-08-19 58 views
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)使用反射。

所以我的问题是:

  1. 有实现使用公共/ protected成员清理功能的方法吗? WeakEventManager.Purge可能很有用,但我不知道如何使用它。
  2. 是否有一种简单的方法在基于Windows.Forms的应用程序中运行WPF消息循环?

回答

2

此代码构建了一个可以保持缓存的静态函数。它会消除每次运行时的反射痛苦,并且基本上就是你所拥有的。每次将它缓存在某处并通过传递您的弱事件管理器来调用它。除了一次打击(在建筑/编译期间),没有进一步的反思。

using System.Windows; 
    using System.Linq.Expressions; 
    using Expression = System.Linq.Expressions.Expression; 

    static void Main(string[] args) 
    { 
     Func<WeakEventManager, bool> cleanUpFunction = BuildCleanUpFunction(); 
    } 

    private static Func<WeakEventManager, bool> BuildCleanUpFunction() 
    { 
     ParameterExpression managerParameter = Expression.Parameter(
      typeof(WeakEventManager), 
      "manager" 
     ); 
     return Expression.Lambda<Func<WeakEventManager, bool>>(
      Expression.Call(
       Expression.Property(
        managerParameter, 
        "Table" 
       ), 
       "Purge", 
       Type.EmptyTypes, 
       Expression.Default(
        typeof(bool) 
       ) 
      ), 
      managerParameter 
     ).Compile(); 
    } 
+0

+1对于一个有趣的答案,虽然性能不是我主要关心的地方。我非常感谢一个不依赖无证私人函数的解决方案。 – Henrik 2011-02-24 15:48:25