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左右。
我见过的两个建议解决方案(以及它们对我不起作用的原因)是:
- 将当前 window (parent/owner) 句柄传递给 ShowDialog 方法(请参阅我在上面的代码中注释掉的尝试:这没有改变内存使用情况。
- 使用 system.windows.forms.savefiledialog 作为 Microsoft 的替代品。Win32.SaveFileDialog:我无法做到这一点,因为我使用的是 .Net5(我的理解是你不能引用 System.windows.forms 来自 .net5 应用程序?)
谁能看出调用 ShowDialog 导致内存泄漏的原因以及如何防止它?谢谢。
在 运行 之后 SaveFileDialog.ShowDialog
你应该尝试 运行
GC.Collect(); GC.WaitForPendingFinalizers();
这应该强制 .Net 在调用下一个例程之前清理与先前调用相关的所有内存。
我的 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左右。
我见过的两个建议解决方案(以及它们对我不起作用的原因)是:
- 将当前 window (parent/owner) 句柄传递给 ShowDialog 方法(请参阅我在上面的代码中注释掉的尝试:这没有改变内存使用情况。
- 使用 system.windows.forms.savefiledialog 作为 Microsoft 的替代品。Win32.SaveFileDialog:我无法做到这一点,因为我使用的是 .Net5(我的理解是你不能引用 System.windows.forms 来自 .net5 应用程序?)
谁能看出调用 ShowDialog 导致内存泄漏的原因以及如何防止它?谢谢。
在 运行 之后 SaveFileDialog.ShowDialog
你应该尝试 运行
GC.Collect(); GC.WaitForPendingFinalizers();
这应该强制 .Net 在调用下一个例程之前清理与先前调用相关的所有内存。