2

WPF アプリケーションのパフォーマンスに問題があります。プロファイラーを使用すると、ウィンドウの 1 つでインスタンスが作成され、時間の経過とともに維持されていることがわかります。そのため、使用されるメモリも増加します。

これは、ライブ インスタンスの数 (赤) とメモリ消費 (ピンク) を含むプロファイラーからのグラフのキャプチャです。

ここに画像の説明を入力

この 15 分間、アプリケーションはユーザーからの入力を受信せず、作成されるインスタンスのタイプは WeakReference です。他の投稿で、WeakReference のリークがイベント登録の不適切な使用によって引き起こされる可能性があることを確認しましたが、この場合、プロファイル セッション中に開いているウィンドウが 1 つしかないため、ディスパッチャーに問題がある可能性があると思われます。

ディスパッチャーを使用して Web カメラから画像をキャプチャし、何らかの処理を行い、処理された画像を次のように 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 ループで 1 億回実行して実行しようとしましたが、その場合、インスタンスとメモリは増加しませんImageProcessor.getCardImageProcessor.ToBitmapSource

4

0 に答える 0