2013-02-01 43 views
0

我只需要一點幫助就澄清Messenger類如何在MVVM-Light中使用ICleanup。我正在使用Mvvm-Light v4在VB.Net中創建一個WPF 4應用程序。在VB.NET中使用mvvm light icleanup和messenger取消註冊

我有寄存器,用於從的NavigationService類發送的消息我創建如下的信使:

這是命名ClientListViewModel

''register for messages 
    Messenger.[Default].Register(Of INavigationService)(Me, "NavigationStart", False, AddressOf HandleParentChildNavigate) 

此接收的NavigationService類和執行在視圖模型登記根據與此問題無關的其他邏輯進行檢查。

如下

''Send message that navigation has been requested 
Messenger.Default.Send(Of INavigationService)(Me, "NavigationStart") 

這樣,如果我接受的類我取消了導航事件(在這種情況下ClientListViewModel)有數據驗證錯誤時,我的NavigationService類是觸發導航事件被髮送的消息,並將焦點返回到有錯誤的記錄。這一切都很好。

我的問題是,我在哪裏以及如何取消註冊郵件。我知道我需要爲了避免內存泄漏,因爲我在其他帖子上閱讀。我看到類似以下的東西:

Public Overrides Sub CleanUp() 
    Messenger.Default.Unregister(Me) 
End Sub 

這個清理是在同一個viewmodel(CientListViewModel)接收消息。

所以我有三個問題:

  1. 我什麼時候應該調用此方法清理

  2. 療法與ViewModelLocator的方式註銷所有郵件收件人,當應用程序被關閉?

  3. 這個問題不太相關,但我也會感激一些幫助,如何判斷是否因未註冊的郵件收件人而導致「內存泄漏」?

感謝您的時間

回答

4

當viewmodels應該「清理」取決於您的應用程序和視圖模型的用法。例如,我使用選項卡式界面來處理應用程序。當用戶關閉代表該選項卡的viewmodel上的選項卡應用程序調用清理(本身也通過它的視圖模型並調用它們的清理)。所以一般的規則 - 只要你不需要viewmodel了 - 你應該清理它(關閉子窗口,標籤等)至於其他問題:

2)它確實沒關係應用程序關閉,如果你清理你的viewmodels。至於關閉所有內存將被釋放,你不會得到內存泄漏:)

3)您應該檢查應用程序內存使用情況。在我們的應用程序中,我們遇到了嚴重的問題(實際上仍然存在但不是,即很大),並且存在內存泄漏。我們確定我們可能通過內存跟蹤泄漏:打開/關閉了很多標籤,名爲GC.Collect() - 但內存使用量沒有下降。我們開始使用WinDbg跟蹤內存泄漏,並發現字面上地段我們沒有從Messenger註銷收件人的地方。另外,我們使用綁定到CommandManager的MVVM Light的舊版本,所以我們也遇到了與RelayCommands有關的問題。道德是 - 你應該考慮在編程期間清理資源,以後可能會發現並修復它。

+0

謝謝亞歷山大,這讓我朝着正確的方向前進 –

1

我沒有用在MVVM,光的使者,所以我不知道是否有清理的固有方式。以下是一些一般這些問題的答案:

  1. 你應該做你的清理,當你不再需要了解的消息,或者當不再需要您的視圖模型。如果Navigate未取消,您的ViewModel會繼續關注Navigate消息嗎(即它是否被卸載或者它支持的視圖消失了)?如果是這種情況,那麼您可以在收到導航命令時取消註冊,並確定可以導航。

  2. 這我不知道。但在應用程序關閉時它應該無關緊要(對於託管對象,請參見下文)。

  3. 當應用程序關閉時,您不需要擔心託管對象的這些內存泄漏問題,當整個應用程序域終止時,任何未引用的對象都將被丟棄。如果你有非託管資源被引用,這是另一回事。

+0

duane,即使您不使用MVVM-Light Messenger,我也很欣賞這種努力,但我將不得不尋找更多的自己來正確使用MVVM-light的高度iCleanup接口,但我會給你對其他信息進行投票。我會回覆我最終如何使用清理界面 –