Ela*_*lad 6 c# wpf memory-leaks richtextbox
在我的应用程序中,我有很多在运行时动态创建的RichTextBox.我意识到应用程序有内存泄漏,这是由RichTextBox控件引起的.为了证明由于控制而导致内存泄漏,我编写了以下测试方法:
for (int i = 0; i < 3000; i++)
{
Control rich = new RichTextBox();
pnl.Content = rich;
}
GC.Collect();
GC.WaitForPendingFinalizers();
Run Code Online (Sandbox Code Playgroud)
pnl是一个在Xaml代码中声明的ContentControl.
如果运行以下代码,则可以看到内存使用量正在快速增长.
任何想法如何解决问题?我考虑过创建一个对象池,但这会使我的应用程序变得复杂,我宁愿避免使用它.
编辑:我已经添加了对垃圾收集器的调用,以证明对象没有被垃圾收集 - 无论是否调用GC收集方法,内存使用情况都没有改善.请注意,rich.Dispose
在循环内调用可以消除内存使用量的增长.
这并不表示您的应用程序存在内存泄漏,这表明您的应用程序正在使用大量内存.这是一个泄漏如果RichTextBox
控件没有得到在某个时候发布,他们已经跌出范围后(在被管理的对象检测内存泄漏是非常困难的和不可证明的).
一个普遍的误解是一个物体超出范围将导致它被垃圾收集.这只是使它有资格被收集.理论上,在应用程序终止之前,永远不会收集该对象.事实上它随着RichTextBox
而不是与其他控件一起增长并不表示存在内存泄漏,RichTextBox
这只表明它每个实例使用的内存比其他控件多.虽然此信息可能有用,但在确定是否存在内存泄漏时无效.
在其他地方找到了这个,就我的测试而言,它似乎是正确的。
创建 FlowDocument 时,还会在其 StructuralCache 中为其创建相对昂贵的格式化上下文对象。当您在紧密循环中创建多个 FlowDoc 时,将为每个 FlowDoc 创建一个 StructuralCache。让我们在循环结束时调用 Gc.Collect,希望恢复一些内存。StructuralCache 有一个终结器释放此格式化上下文,但不会立即释放。终结器有效地安排一个操作来释放 DispatcherPriority.Background 处的上下文。
因此,RichTextBox(或 FlowDocument)以防泄漏,只是等待后台线程进行清理。谁知道它什么时候运行。我希望这只是实现了一个立即强制清理的处理方法。
归档时间: |
|
查看次数: |
3672 次 |
最近记录: |