Microsoft.win32.SaveFileDialog 干扰内存使用 WPF (.Net5)

Microsoft.win32.SaveFileDialog interferes with memory usage WPF (.Net5)

我的 MVVM 视图模型中有一个私有方法,当用户按下视图上的按钮时调用该方法。在这种方法中,我想要求用户指定要保存的文件,然后调用静态 class 库来执行一些图像处理(从光盘读取文件,进行一些小处理并将它们写入 mp4 文件使用ffmediaToolkit.

private void makeMP4()
{
    Microsoft.Win32.SaveFileDialog saveFileDialog = new Microsoft.Win32.SaveFileDialog();
    saveFileDialog.Filter = "Media File (*.mp4)|*.mp4";
    saveFileDialog.InitialDirectory = @"D:\temp\mp4output\";
    saveFileDialog.FileName = myImageHandler.SuggestedFileName + ".mp4";

    // If I remove the following line, memory usage is stable at 1GB. If I keep this line
    // memory grows linearly until program terminates.
    _ = saveFileDialog.ShowDialog();

    // I also tried passing current window handle to ShowDialog (with same outcome):
    //_ = saveFileDialog.ShowDialog(Application.Current.Windows.OfType<MainWindow>().FirstOrDefault());

    MP4Maker mp4Maker = new(myImageHandler);
    mp4Maker.GenerateMP4(@"D:\temp\mp4maker\hardcodedFileName.mp4");
}

正如上面代码中的注释所解释的,如果我调用 ShowDialog 方法,我的应用程序在处理 mp4 文件时会消耗太多内存。但是如果我省略对ShowDialog的调用,内存使用量稳定在1GB左右。

我见过的两个建议解决方案(以及它们对我不起作用的原因)是:

  1. 将当前 window (parent/owner) 句柄传递给 ShowDialog 方法(请参阅我在上面的代码中注释掉的尝试:这没有改变内存使用情况。
  2. 使用 system.windows.forms.savefiledialog 作为 Microsoft 的替代品。Win32.SaveFileDialog:我无法做到这一点,因为我使用的是 .Net5(我的理解是你不能引用 System.windows.forms 来自 .net5 应用程序?)

谁能看出调用 ShowDialog 导致内存泄漏的原因以及如何防止它?谢谢。

在 运行 之后 SaveFileDialog.ShowDialog 你应该尝试 运行

GC.Collect(); GC.WaitForPendingFinalizers();

这应该强制 .Net 在调用下一个例程之前清理与先前调用相关的所有内存。