如何识别和解决WPF的BeginInvoke()中的内存泄漏?

时间:2015-04-28 16:43:16

标签: c# .net wpf begininvoke

我正在使用Windows .Net C#WPF应用程序。 除了在画布中显示一些其他分析数据外,该应用程序还显示视频帧。

该应用程序正在处理大约每秒15帧的帧速率。 处理在单独的线程上完成。当分析完成并且要更新显示时,处理线程发送回调。

当我在一段时间内运行应用程序时,我注意到了一些显着的内存增长(泄漏)。运行几个小时后,应用程序的内存占用量增加到200MB以上。

为了尝试跟踪这些泄漏,我正在使用红门的ANT内存分析器。  根据我捕获的结果,我的dispatcher.BeginInvoke()调用似乎是至少一些泄漏的来源。

dispatcher.BeginInvoke()是必需的,因为我从不同的线程(UI线程以外的其他线程)更新UI。

以下是应用程序的示例代码块:

canvas.Dispatcher.BeginInvoke((Action)(() =>
{
   // Clear the previous points
   canvas.Children.Clear();
   SolidColorBrush pointBrush = new SolidColorBrush(Colors.Cornsilk);
   foreach (var point in points)
   {
      Ellipse ellipse = new Ellipse()
      {
         Width = 4,
         Height = 4,
         Fill = pointBrush
      };

      canvas.Children.Add(ellipse);
      Canvas.SetLeft(ellipse, point.x * XScaleFactor);
      Canvas.SetTop(ellipse, point.y * YScaleFactor);
   }

   SolidColorBrush boundingBrush = new SolidColorBrush(Colors.Bisque);
   Rectangle boundingBox = new Rectangle()
   {
      Width = width,
      Height = height,
      Stroke = boundingBrush,
      StrokeThickness = 1,
   };

   canvas.Children.Add(boundingBox);
   Canvas.SetLeft(boundingBox, xMin * mImageXScaleFactor);
   Canvas.SetTop(boundingBox, yMin * mImageYScaleFactor);
   }
}));

使用红门内存分析器运行后,我看到Dispatcher()类的许多实例看起来像每个实例大约64字节泄漏。请记住,我每秒处理15帧,这种情况稳步增加。在匿名功能块中是否存在绘制方式,这会阻止与每个BeginInvoke()相关的开销被释放?

我如何弄清楚这里到底发生了什么,以及如何解决这个问题?

谢谢, JohnB

0 个答案:

没有答案