2011-09-29 81 views
1

在開始使用來自使用弱引用的開源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。尋找使用不當的析構函數。 –

回答

2

會盡量給一個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