2016-01-22 30 views
3

我目前使用一個ContentControl中顯示通過設置虛擬機,並使用這樣的默認數據模板,我的看法:免費存儲在ContentControl中使用

<UserControl.Resources> 
    <DataTemplate DataType="{x:Type vm:MyViewViewModel}"> 
     <views:MyView /> 
    </DataTemplate> 
</UserControl.Resources> 
<ContentControl Content="{Binding ContainerContent}"/> 

這裏是我的ContainerContent:

public ViewModelBase ContainerContent 
{ 
    get 
    { 
     return _containerContent; 
    } 
    set 
    { 
     if (_containerContent != null) 
      _containerContent.Cleanup(); 

     _containerContent = value; 
     RaisePropertyChanged("ContainerContent"); 
    } 
} 

我目前使用SimpleIoc通過服務定位器來加載視圖模型:

ContainerContent = ServiceLocator.Current.GetInstance<MyViewViewModel>(); 

這很好,並正確顯示我的視圖和viewModel分配給內容。

不幸的是,當我想從我的ContentControl中刪除視圖(和視圖模型)時,由於ViewModel,View和SimpleIoc之間的發佈順序,我的內存仍然被使用。視圖有一段時間引用它認爲這是定時由於在容器上

我目前使用的方法,以除去內容RaisePropertyCHange後的結合):

public void QuitCurrentContainerViewModel<T>() where T : class 
     { 
      ContainerContent = null; 
      Task.Factory.StartNew(() => 
      { 
       if (/*!*/SimpleIoc.Default.ContainsCreated<T>()) 
       { 
        SimpleIoc.Default.Unregister<T>(); 
       } 
       DispatcherHelper.RunAsync(() => 
       { 
        MessageBox.Show("Do GC now"); 
        GC.Collect(); 

       }, DispatcherPriority.ApplicationIdle); 
      }); 
     } 

(使用調度和優先級是一個測試)

如果我稱之爲有時我的記憶被正確釋放,但並非總是如此。

在每一種情況下,如果我從例如快捷方式強制GC.Collect,我的記憶是正確管理。

在我的情況下釋放內存的好方法是什麼?

謝謝!

編輯:我的壞,它正常工作與代碼(在我QuitCurrentContainerViewModel方法我使用這個檢查:

if (!SimpleIoc.Default.ContainsCreated<T>()) 

但我需要這樣的:

if (SimpleIoc.Default.ContainsCreated<T>()) 

這樣,它似乎工作正常

回答

0

這裏的清潔沒有無用的電話

public ViewModelBase ContainerContent 
      { 
       get 
       { 
        return _containerContent; 
       } 
       set 
       { 
        if (_containerContent != null) 
         _containerContent.Cleanup(); 

        _containerContent = value; 
        RaisePropertyChanged("ContainerContent"); 
       } 
      } 

      public void QuitCurrentContainerViewModel<T>() where T : class 
      { 
       ContainerContent = null; 
       Task.Factory.StartNew(() => 
       { 
        if (SimpleIoc.Default.ContainsCreated<T>()) 
        { 
         SimpleIoc.Default.Unregister<T>(); 
         GC.Collect(); 
        } 
//TODO: Do navigation or change of content  
       }); 
      } 

,在這裏我的ContentContainer

Task.Factory.StartNew(() => 
      { 
       if (!SimpleIoc.Default.ContainsCreated<MyViewModel>()) 
        SimpleIoc.Default.Register<MyViewModel>(); 
       ContainerViewModel.ContainerContent = SimpleIoc.Default.GetInstance<MyViewModel>(); 
      }); 

加載我的代碼,如果任何人有一個更好的辦法來解決這個內存管理,我是完全開放的。

1

什麼是在我的情況下釋放內存的好方法?

對每個對象使用IDisposable模式,並在泛型類型說明符中要求它。這樣,可以直接調用頂層實體,從而可以隨後清理所有遵循界面的子引用。

請記住,具有訂閱的實例(儘管實例未在代碼中直接引用)將變爲固定爲,並且如果它們具有任何活動的訂閱,它們將保持活動狀態;保持垃圾收集器在海灣。

在垃圾收集實例之前,所有訂閱都必須取消鏈接。

如果我打電話這有時我的記憶被正確地釋放,但並不總是。

您是否正在查看應用程序的專用字節?對於操作系統報告的全部數據,如果操作系統沒有受到壓力,它不會消除內存佔用量,允許應用程序呼吸。專用字節將在全部分配的總數內上下移動。

所以你可能會監測錯誤的值。

+0

感謝您的回覆。我已經試圖實現Idisposable沒有成功。它認爲dispose方法未被調用,因爲視圖在刷新之前「阻止」實例。 關於內存消耗,我使用私有字節的進程資源管理器性能視圖。 – Tchoupi