弱引用相关异常

问题描述:

在开始使用来自使用弱引用的开源MVVM框架中的类来防止内存泄漏后,我开始获取下面的异常。弱引用相关异常

该类被称为PropertyObserver,“处理其他对象的INotifyPropertyChanged.PropertyChanged事件的标准方式。该类使用弱引用和弱事件模式来防止内存泄漏。”

异常的触发器是退出WPF应用程序,其中ShellVm具有对MasterVm的引用,该MasterVm引用了多个DetailVms,每个DetailVms都包含上述PropertyObserver。 MasterVm最终是静态Inflector类的消费者,用于复数化和大写this,并且这是WeakReference相关异常被抛出的地方。

我不能说我完全明白这个例外,所以我想这就是出发点。我将如何开始解决这个问题?

干杯,
Berryl

System.InvalidOperationException was unhandled by user code 
Message=Handle is not initialized. 
Source=mscorlib 
StackTrace: 
    at System.WeakReference.set_Target(Object value) 
    at System.Text.RegularExpressions.Regex.Replace(String input, String replacement, Int32 count, Int32 startat) 
    at System.Text.RegularExpressions.Regex.Replace(String input, String replacement) 
    at Inflector.Inflector.Rule.Apply(String word) 
    at Inflector.Inflector.ApplyRules(List`1 rules, String word) 
    at Inflector.Inflector.Pluralize(String word) 
    at Smack.Core.Lib.TextUtil.StringEx.Pluralize(String s) 
    at Smack.Core.Lib.TextUtil.StringEx.PluralizeWithCount[T](String s, IEnumerable`1 collection) 
    at Smack.Core.Presentation.Wpf.ViewModels.MasterDetailVms.GenericMasterViewModel`2.get_Status() 

的InnerException:

+0

您使用的是什么版本的.NET,哪个版本使用该框架? – Tigran

+0

@Tigran。我所有的程序集都是4.0。我将代码复制到现有的程序集中,因此没有引用PropertyObserver的框架DLL。引发的Inflector代码是在一个DLL中,可能是一个旧版本(不知道如何确定,但肯定) – Berryl

+5

异常实际上是由正则表达式触发的,它也使用弱引用。堆栈跟踪非常不完整。 Quacks就像库代码中的一个bug。寻找使用不当的析构函数。 –

会尽量给一个suggession,因为这样的事情我很多年前认识。说实话,我没有找到一个真正的解决方案。首先是一个粗略的,在改变建筑之后。

恐怕没有其他解决方案了,那么只需试试就可以调用GC.Collect()来销毁对象(粗略的解决方案),或者只是改变MVVM框架。

google搜索了一些后:

Handle not initialized1

Handle not initialized2

总之这是一件关系到存在于不同版本的.NET FrameworkWeakReferences错误。

祝你好运。

+0

这听起来并不令人鼓舞......叹息,再一天 – Berryl

+0

@Berryl:悲伤,但真实。也许你可以下载它,在.NET 4.0下重新编译,并希望“解决”你的问题... – Tigran

+1

在我看到Hans的评论之前,我确实做到了这一点。问题是一个流氓析构函数,WeakRef以某种方式加剧了 – Berryl