2015-11-02 2 views
-1

Недавно я сделал оптимизацию производительности, используя элементы управления, создающие и заполняющие данные в отдельном потоке (STA). После этого я обнаружил утечку памяти в приложении: сетки, унаследованные от DataGridView не освобождали хранение больших объемов памяти: dotMemory reportOnUserPreferenceChanged hang: DataGridView, созданный в отдельном потоке

После некоторого исследования я обнаружил, что причина подписки на SystemEvents.UserPreferenceChanged мероприятия: path

Таким образом, цель состоит в том, чтобы избавиться от этой подписки, чтобы освободить объекты. Я потратил время, чтобы проверить некоторые подходы, найденные в Google (например, этот: Memory Leak in ToolStripTextBoxControl), но не удалось.

+0

Почему «-1»? Что случилось с вопросом? –

+0

Плохое настроение сегодня? –

ответ

-1

Это мое решение. Это не идеально, но решает проблему: Я нашел, что подписка/отказ от подписки на мероприятие SystemEvents.UserPreferenceChanged находится в методах OnHandleCreated/OnHandleDestroyed (класс DataGridView).

public class MyDataGridView : DataGridView 
{ 
    ... 
    #region Memory leak fix 

    int _eventSubscriptionCount; 

    /// <summary> 
    /// Hack to fix event handler leak 
    /// </summary> 
    private void MemoryLeakFix() 
    { 
     Disposed += OnDisposed; 
    } 

    /// <summary> 
    /// In some cases subscription keeps PinkDataGridView (and containing it controls) from removing by GC 
    /// </summary> 
    private void OnDisposed(object sender, EventArgs eventArgs) 
    { 
     for (int i = 0; i < _eventSubscriptionCount; i++) 
     { 
      base.OnHandleDestroyed(new EventArgs()); // unsubscribe SystemEvents.UserPreferenceChanged 
     } 
    } 

    protected override void OnHandleCreated(EventArgs e) 
    { 
     base.OnHandleCreated(e); 
     Interlocked.Increment(ref _eventSubscriptionCount); 
    } 

    protected override void OnHandleDestroyed(EventArgs e) 
    { 
     base.OnHandleDestroyed(e); 
     Interlocked.Decrement(ref _eventSubscriptionCount); 
    } 

    #endregion Memory leak fix 
} 
Смежные вопросы