Утечка памяти с IDisposable во ViewModel, почему? - PullRequest
2 голосов
/ 07 февраля 2012

Использование C #, WPF, MVVM, Prism, MEF. Мне нужны внешние эффекты (у меня это из View называется Dispose ()), чтобы освободить ресурсы в ViewModel, используемые в View. Я использую что-то вроде следующего кода:

public class MyViewModel: IDisposable, IMyViewModel, ...
{
    private bool disposed = false;

    private System.Timers.Timer timer;

    public MyViewModel()
    {
        timer = new System.Timers.Timer();
        timer.Interval = 100;
        //timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
        timer.Start();
    }

    public void Dispose()
    {
        Dispose(true);

        GC.SuppressFinalize(this);
    }

    protected virtual void Dispose(bool disposing)
    {
        if(!this.disposed)
        {
            if(disposing)
            {
                // Dispose managed resources.
                timer.Dispose();
                timer = null;
                //GC.KeepAlive(timer);
                //GC.Collect();
            }

            disposed = true;
        }
    }

    ~MyViewModel()
    {
        Dispose(false);
    }
}

Таким образом, экземпляры View и ViewModel не уничтожаются и возникает утечка памяти. Если вы удаляете интерфейс и его методы IDisposable, View и ViewModel удаляются успешно.

Я использую ANTS Memory Profiler. На следующей диаграмме вы видите три экземпляра из DisposableReflecationComposablePart, но они должны быть одним экземпляром.

enter image description here

Я не могу понять, что происходит. Есть идеи?

Edit: Я понимаю, что мои заявления объясняют проблему по ссылке: http://mef.codeplex.com/wikipage?title=Parts%20Lifetime&referringTitle=Guide

в следующем предложении: Таким образом, контейнер не будет содержать ссылки на части, которые он создает, если не выполнено одно из следующих действий:

 The part is marked as Shared
 The part implements IDisposable
 One or more imports is configured to allow recomposition

1 Ответ

3 голосов
/ 08 февраля 2012

См. мой вопрос здесь для ответов, которые могут вам помочь.

Я был в подобной ситуации и в итоге использовал пользовательский интерфейс, скажем ICleanup вместо IDisposable, чтобы избежать сохранения в MEF ссылки на мои представления.

Я считаю, что это очень большой недостаток в дизайне MEF. Я думал, что они, по крайней мере, позволят каждой части решить для себя, следует ли сохранять ссылку на нее, используя определенный атрибут или реализуя интерфейс ...

...