C# 弱引用相关异常

C# 弱引用相关异常,c#,weak-references,C#,Weak References,在开始使用开源MVVM框架中的一个类,该类使用弱引用来防止内存泄漏之后,我开始出现以下异常 此类称为PropertyObserver,“处理其他对象的INotifyPropertyChanged.PropertyChanged事件的标准化方法。此类使用弱引用和弱事件模式来防止内存泄漏。” 引发异常的触发器是退出WPF应用程序,其中ShellVm引用了MasterVm,MasterVm引用了多个DetailVM,每个DetailVM都持有上述PropertyObserver。MasterVm最终是

在开始使用开源MVVM框架中的一个类,该类使用弱引用来防止内存泄漏之后,我开始出现以下异常

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

引发异常的触发器是退出WPF应用程序,其中ShellVm引用了MasterVm,MasterVm引用了多个DetailVM,每个DetailVM都持有上述PropertyObserver。MasterVm最终是静态拐点类的使用者,该类用于将这个和那个进行多元化和资本化,这就是引发WeakReference相关异常的地方

我不能说我完全理解这个例外,所以我想这就是起点。我将如何开始解决这个问题

干杯,
贝里尔


InnerException:

将尝试给出一个建议,就像我多年前遇到的这样。老实说,我没有找到真正的解决办法。首先是一个粗糙的,然后只是改变一个架构

恐怕没有其他解决方案,那么就尝试在销毁对象时调用GC.Collect()(粗略的解决方案),或者只是更改MVVM框架

在谷歌搜索了一些之后:

简而言之,这与不同版本的
.netframework
中存在的
WeakReferences
缺陷有关


祝你好运。

你使用的是什么版本的.NET?什么版本使用这个框架?@Tigran。我的所有程序集都是4.0。我将代码复制到现有程序集中,因此没有对PropertyObserver的框架dll的引用。抛出的拐点代码位于dll中,可能是旧版本(不确定如何确定)异常实际上是由正则表达式触发的,它还使用弱引用。堆栈跟踪非常不完整。像库代码中的bug一样嘎嘎作响。寻找使用不当的析构函数。@HansPassant。就是这样,析构函数中的某个日志行的值为null-谢谢!。为什么不把它放在一个答案的格式,这样我就可以这样标记它呢?听起来并不鼓舞人心的欢呼声。。。唉,又一个day@Berryl:悲伤,但却是真的。也许你可以下载它,在.NET4.0下重新编译,希望能“解决”你的问题……事实上,在我看到Hans的评论之前,我就这么做了。问题出在一个无赖的破坏者身上,这个懦夫不知何故加剧了这一问题
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()