2015-11-02 149 views
-1

最近我通過使用控件創建和填充單獨線程(STA)中的數據來進行性能優化。在那之後,我發現應用程序中的內存泄漏:電網從DataGridView繼承沒有公佈保存大量的內存: dotMemory reportOnUserPreferenceChanged掛起:在單獨的線程中創建的DataGridView

經過一番調查,我發現原因是認購SystemEvents.UserPreferenceChanged事件: path

所以我們的目標是擺脫這個訂閱來釋放對象。 我花時間測試了使用Google搜索找到的一些方法(例如這一個:Memory Leak in ToolStripTextBoxControl),但沒有成功。

+0

爲什麼「-1」?這個問題有什麼問題? –

+0

今天心情不好嗎? –

回答

-1

這是我的解決方案。這並不完美,但解決了問題: 我發現事件SystemEvents.UserPreferenceChanged的訂閱/取消訂閱方法是OnHandleCreated/OnHandleDestroyedDataGridView類)。

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 
}