問題: 大きな PDF ファイル (50Mb、1500 ページ) を使用して非同期に LoadFile() を数回 (10 ~ 20 回で十分) 呼び出すと、すぐに OutOfMemory 例外が発生します。EndInvoke() の後に GC.Collect() を呼び出すと、問題が解決します。
同期呼び出しはうまく機能します (メモリ リークは発生しません)。
GC.Collect() を直接呼び出さずに解決する方法についてのアイデアはありますか?
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Open_Click(object sender, EventArgs e)
{
MethodInvoker invoker = this.LoadFile;
AsyncCallback callback = CallBack;
invoker.BeginInvoke(callback, null);
// Synchronous call.
// LoadFile();
}
private void CallBack(IAsyncResult ar)
{
AsyncResult result = (AsyncResult)ar;
MethodInvoker invoker = (MethodInvoker)result.AsyncDelegate;
invoker.EndInvoke(ar);
// GC.Collect();
}
private void LoadFile()
{
byte[] fileBytes = File.ReadAllBytes(@"c:\50mb.pdf");
// Third party OCX component for viewing PDF files.
this.pdfOcxViewer.OpenBuffer(fileBytes, fileBytes.Length, "");
this.pdfOcxViewer.CloseFile();
}
}