C#中的FlowDocument内存问题

Jas*_*son 8 c# memory flowdocument .net-3.5

我目前正在尝试处理释放FlowDocument资源的问题.我正在加载一个rtf文件并将其放入带有TextRange.Load的FlowDocument中.我注意到,在它执行此操作后,它会保留这些资源,GC不会收集它.我已经运行了一个内存分析器,并且已经看到这是真的.我还把它缩小到我加载实际将rtf放入FlowDocument.如果我不这样做,那么一切都很好.所以我知道这是问题所在.

我希望对如何解决这个问题提供一些指导.这是加载rtf和所有内容的代码.我已经评论了所有其他代码,甚至将它放在自己的范围内,并尝试了GC.Collect().任何帮助是极大的赞赏.

编辑:这是我的代码.除了最基本的要素之外,我已经取出了其他所有东西来让它运行起来.问题仍然存在.如您所见,FlowDocument和TextRange不会在其他任何地方引用.

    public LoadRTFWindow(string file)
    {
        InitializeComponent();

        using (FileStream reader = new FileStream(file, FileMode.Open))
        {
            FlowDocument doc = new FlowDocument();
            TextRange range = new TextRange(doc.ContentStart, doc.ContentEnd);
            range.Load(reader, System.Windows.DataFormats.Rtf);
        }
        GC.Collect();
        GC.WaitForPendingFinalizers();
        GC.Collect();
    }
Run Code Online (Sandbox Code Playgroud)

我找到了这篇文章,我希望能帮助我解决问题,但我没有运气.非常感谢任何类型的帮助.谢谢.

编辑:我想我应该提到我检查这个的主要方式.我打开了Windows任务管理器,正在观察应用程序进程正在使用的内存使用情况.当我运行上面的代码时,应用程序从40,000K到70,000K,同时执行TextRange.Load()(这是一个400页的大型RTF),一旦完成它就会下降到61,000K并保持在那里.我的期望是它会回落到40,000K或者至少非常接近它.

正如我之前提到的,我使用了一个内存分析器,看到有很多段落,Run ..ect.事后仍然活着.

Sen*_*mar 6

如果我已经确认存在内存泄漏,那么我将采取以下措施来调试问题.

  1. http://www.microsoft.com/whdc/devtools/debugging/installx86.mspx#a安装Windows调试工具
  2. 从安装目录中启动Windbg.
  3. 启动应用程序并执行泄漏内存的操作.
  4. 将Windbg附加到您的应用程序(F6).
  5. 类型 .loadby sos mscorwks
  6. 类型 !dumpheap -type FlowDocument
  7. 检查上面命令的结果.如果您看到多个FlowDocuments,对于第一列的每个值(包含地址),请执行

类型 !gcroot <value of first column>

这应该会告诉你谁在坚持参考.


Has*_*niH 0

确保 FlowDocument 的父级没有闲置,请参阅此处。“实例化 FlowDocument 会自动生成托管内容的父 FlowDocumentPageViewer。” 如果该控件仍然存在,则可能是问题的根源。