簡體   English   中英

Microsoft.win32.SaveFileDialog 干擾 memory 用法 WPF (.Net5)

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

我的 MVVM 視圖 model 中有一個私有方法,當用戶按下視圖上的按鈕時調用該方法。 在這種方法中,我想要求用戶指定要保存的文件,然后調用 static class 庫來執行一些圖像處理(從光盤讀取文件,進行一些小處理並使用 ffmediaToolkit 將它們寫入 mp4 文件。

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 文件時會消耗太多 memory。 但是如果我省略對 ShowDialog 的調用,memory 的使用量穩定在 1GB 左右。

我見過的兩個建議解決方案(以及它們對我不起作用的原因)是:

  1. 將當前的 window(父/所有者)句柄傳遞給 ShowDialog 方法(請參閱我在上面的代碼中注釋掉的嘗試:這並沒有改變 memory 的用法。
  2. 使用 system.windows.forms.savefiledialog 作為 Microsoft.Win32.SaveFileDialog 的替代方案:我無法執行此操作,因為我使用的是 .Net5(我的理解是您不能從 .net5 應用程序中引用 System.windows.forms?)

任何人都可以看到為什么調用 ShowDialog 導致 memory 泄漏以及如何防止它? 謝謝。

運行SaveFileDialog.ShowDialog后,您應該嘗試運行

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

這應該強制.Net 在調用下一個例程之前清理與先前調用相關的任何 memory。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM