WeakReference了解

时间:2012-06-07 08:32:50

标签: c# wpf weak-references

我想创建所有ViewModel的字典。

   public static Dictionary<string, WeakReference> vmCollection = new Dictionary<string, WeakReference>();

像这样添加

 vmCollection.Add(name, new WeakReference(viewModel));

并调用所需的方法..

((vmCollection[viewModel].Target) as BaseViewModel).NewMessage(message);

我需要将其保留为WeakReference吗?如果我不将其维持为WeakReference,可能会产生什么后果。

2 个答案:

答案 0 :(得分:19)

不使用WeakReference的唯一后果是,字典中的引用将阻止视图模型实例被垃圾回收。 WeakReference允许垃圾收集(假设其他地方没有其他固体引用)。

当项目没有引用时,它就有资格进行垃圾回收。 WeakReference不会创建“可数”引用,因此您可以对其进行引用排序,但如果WeakReference是唯一留下它的话,仍然可以使其符合条件。< / p>

您是否需要它实际上取决于您的View Models具有的生命周期类型。如果他们需要处置或以其他方式“放弃”,那么您可能需要使用WeakReference或者公开一种方法来从字典中删除引用。

正如我在评论中提到的那样。我倾向于使用WeakReference而不是明确地处理相关对象的生命周期。也就是说,当您在相关点上无法查看生命周期时,它们非常有用。我认为在您的情况下,您应该具有必要的可见性,因为这些可能都在UI层中,因此应该尝试使用它们。

以下是有关该主题的一些资源:

从以上MSDN链接中提取指南:

  

仅在必要时使用长弱引用作为状态   最终确定后,对象无法预测。

     

避免使用对小对象的弱引用,因为指针   本身可能大或大。

     

避免使用弱引用作为内存的自动解决方案   管理问题。相反,为...制定有效的缓存策略   处理应用程序的对象。

我相信最后的指导方针适用于您的情况。

答案 1 :(得分:0)

我采用了稍微不同的方法。

在此示例中,我只有一个单个实例,但是我确信它可以很容易地扩展到多个实例...

因此,在我的课堂上,我创建了以下Action(如果您需要返回某些内容,则可以为Func)。对于我的示例,我只是在推一个Exception:

private  static Action<Exception> StaticAccessorToInstanceMethod { get; set; }

我要调用的实例方法是:

public void HandleExceptionDetails(Exception e)
{
    // Content of the method on the instance
}

然后在我的构造函数中添加它:

StaticAccessorToInstanceMethod = this.HandleExceptionDetails;

以及析构函数中的以下内容:

StaticAccessorToInstanceMethod = null;

(如果要处理多个实例,则构造函数和析构函数代码将有所不同)。

然后,静态方法仅调用实例方法:

public static void HandleGeneralException(Exception ex)
{    
     StaticAccessorToInstanceMethod(result);
}

我没有防守逻辑。