Ich habe Probleme mit der Speichererweiterung. Ich benutze MEF in caliburn.micro auf Erstellung neuer Bildschirm - WPF-Fenster.Exportieren mit MEF in Caliburn.Micro - Speicherproblem erhöhen
Ansicht Modell der Bildschirm/Ansicht wie folgt aussehen:
[Export(typeof(IChatViewModel))]
[PartCreationPolicy(CreationPolicy.NonShared)]
public class ChatViewModel : Screen, IChatViewModel
{}
Auf Schöpfung ich ExportFactory verwenden, Controler ist hier:
public interface IViewModelsControler
{
ExportLifetimeContext<IChatViewModel> CreatChatViewModel();
}
[Export(typeof(IViewModelsControler))]
public class ViewModelsControler : IViewModelsControler
{
[Import]
public ExportFactory<IChatViewModel> ChatViewFactory { get; set; }
public ExportLifetimeContext<IChatViewModel> CreatChatViewModel()
{
return ChatViewFactory.CreateExport();
}
}
I ViewModelsControler Klasse in ChatScreenManager Klasse. Diese Klasse öffnet/entfernt den Chat-Bildschirm.
Hier ist es:
[Export(typeof(IChatScreenManager))]
public class ChatScreenManager : IChatScreenManager
{
private IWindowManager _windowManager;
[Import]
public IViewModelsControler ViewModelControler { get; set; }
[ImportingConstructor]
public ChatScreenManager(IWindowManager windowManager)
{
_windowManager = windowManager;
ActiveChatScreens = new Dictionary<string, ExportLifetimeContext<IChatViewModel>>();
}
//store active screen
public Dictionary<string, ExportLifetimeContext<IChatViewModel>> ActiveChatScreens { get; set; }
public void OpenChatScreen(DetailData oponent, string avatarNick, BitmapImage avatarImage)
{
if (!ActiveChatScreens.ContainsKey(oponent.Info.Nick))
{
//create new chat screen with view model controler
ExportLifetimeContext<IChatViewModel> chatScreen = ViewModelControler.CreatChatViewModel();
//show
_windowManager.Show(chatScreen.Value);
//add ref to the dic
ActiveChatScreens.Add(oponent.Info.Nick, chatScreen);
}
}
public void RemoveChatScreen(string clossingScreen)
{
MessageBox.Show(GC.GetTotalMemory(true).ToString());
ActiveChatScreens[clossingScreen].Dispose();
ActiveChatScreens.Remove(clossingScreen);
GC.Collect();
GC.SuppressFinalize(this);
MessageBox.Show(GC.GetTotalMemory(true).ToString());
}
}
Und mein Problem ist:
- I OpneChatScreen Methode von ChatScreenManager nennen es neue WPF-Fenster öffnen
- Referenz hinzufügen in diesem Fenster in das Wörterbuch.
- Wenn ich Fenster schließe, rufe ich RemoveChatScreen.
In RemoveChaScreen:
- I Gesamtspeicher zu erhalten, ist es beispielsweise 37.000
- Dann dipose Methode auf ExportLifetimeContext chatScreen
- Kraft GC
- Und Gesamtspeicher bekommen ich rufe, zum Beispiel ist es 39,000K
Speicherverbrauch ist stil steigt Ing. Ich hoffe, wenn ich Dispose-Methode auf Objekt ChatViewModel und auch ChatView-Objekt aufrufen, werden diese Objekte zerstört.
FYI, verwenden Sie die [C#] oder [net] Tags Ihre Fragen zu identifizieren, um Code-Beispiele richtig formatiert werden kann. ;) – IAbstract