問題:大きなPDFファイル(50Mb、1500ページ)を使用してLoadFile()を何回か(10-20回で十分)非同期で呼び出すと、OutOfMemory例外がかなり早く発生します。 EndInvoke()の後にGC.Collect()を呼び出すと、問題が解決されます。メソッドを非同期で何回か呼び出すとOutOfMemory例外が発生する
同期呼び出しは素晴らしいです(メモリリークは発生しません)。
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();
}
}
なぜ、コンポーネントの複数のインスタンスが実行されていると思いますか?コンポーネントをラップするコントロールは、明らかに単一のインスタンスを持っています。 – Corvin