4 つの PictureBox コントロールを持つ Winform があり、各コントロールには異なる画像が含まれます。プロセスは次のとおりです。
イベント x が発生し、このイベントからの eventargs には、各画像のファイル名 (4) が含まれます (ファイルが存在するなど)。次に、UI を更新する必要があります。
一般的に私は呼び出しを使用します:
Invoke((ThreadStart)delegate()
{
picBig.Image = new Bitmap(strImageBig);
picLittle1.Image = new Bitmap(saLittle[0]);
picLittle2.Image = new Bitmap(saLittle[1]);
picLittle3.Image = new Bitmap(saLittle[2]);
});
// saLittle[] is a string array, contains, filenames: "image1.jpg"
しかし、これが実行されると、フォームは約 500 ミリ秒の間フリーズします。短い間隔であることはわかっていますが、目立ちます。その後、アプリは正常に続行されます。
その「UI フリーズ」の理由を突き止めようとしていたところ、調査の結果、BeginInvoke が見つかりました。今私のコードは次のようになります:
BeginInvoke((MethodInvoker)delegate
{
picBig.Image = new Bitmap(strImageBig);
picLittle1.Image = new Bitmap(saLittle[0]);
picLittle2.Image = new Bitmap(saLittle[1]);
picLittle3.Image = new Bitmap(saLittle[2]);
});
これは少し速いです。しかし、UI はまだ 200 ~ 300 ミリ秒フリーズしています。
私が読んだ記事では、BeginInvoke は Invoke よりも優れた方法であると書かれています。
コードは問題なく動作しています。ロジックなどに問題はありません。なぜこれが起こるのか知りたいだけです。この疑問を曖昧にしたくありません。プロジェクトはすでに終了しています。これが他の誰かに役立つことを願っています。
たぶん、これは正しいアプローチではありません。バックグラウンド スレッドから UI を更新する方法はたくさんありますが、更新を高速化する別の方法はありますか?
それとも、画像の読み込みが原因だと思いますか? 画像の読み込みを高速化する別の方法はありますか?
前もって感謝します。