2015-11-02 103 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 
} 
相关问题