WeakReference使用wpf调度程序泄漏

时间:2013-10-07 23:07:52

标签: c# wpf memory-leaks dispatcher weak-references

我遇到WPF应用程序性能问题。使用分析器我可以看到,在我的一个窗口中,有一些实例被创建并随着时间的推移而保持活动状态,因此使用的内存也会增长。

这是从分析器捕获的图表,其中包含实时实例数(红色)和内存消耗(粉红色)。

enter image description here

应用程序在15分钟内没有收到用户的输入,并且正在创建的实例的类型是WeakReference。在其他帖子中,我看到WeakReference的泄漏可能是由于事件注册的错误使用造成的,但在这种情况下,我在配置文件会话期间只打开了一个窗口,因此我怀疑它可能是调度程序的问题。

我使用调度程序从网络摄像头捕获图像,进行一些处理并以这种方式在WPF窗口中显示处理过的图像:

private delegate void AnalyzeImage();
Image<Bgr, byte> image;
String imagesFolder = "..\\..\\"

public MyWindow(){
    InitializeComponent();
    AnalyzeImage fetcher = new AnalyzeImage(this.getCard);
    fetcher.BeginInvoke(null, null);
}


private void UpdateInterface()
{
    ListReadCards.Items.Add(cardName);
    imageBackup.Source = ImageProcessor.ToBitmapSource(image);
    AnalyzeImage fetcher = new AnalyzeImage(this.getCard);
    fetcher.BeginInvoke(null, null);
    if (card > cardsToRead)
    {
        finished = true;
        this.Close();
    }
}


public void getCard()
{
    Image<Gray, byte> thresholdImage;
    cardName = ImageProcessor.getCard(capture.QueryFrame(), out thresholdImage, out image, imagesFolder);
    this.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Normal, new AnalyzeImage(UpdateInterface));
    if (cardName != null)
    {
        hand.Add(cardName);
        card++;
    }
}

已经尝试在for循环中执行ImageProcessor.getCardImageProcessor.ToBitmapSource 1亿次以检查这些调用是否存在问题,但在这种情况下实例和内存不会增长。

0 个答案:

没有答案