我正在使用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