我有一个带有 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~300ms。
在我读过的文章中,他们说 BeginInvoke 比 Invoke 更好。
代码工作正常,逻辑或其他任何问题都没有问题。我只是想知道为什么会这样。我不想让这个疑问不清楚。该项目已经完成。希望这对其他人有用。
也许这不是正确的方法。我知道有很多方法可以从后台线程更新 UI,但是还有另一种方法可以更快地更新吗?
或者,您认为图像加载是原因吗?还有其他方法可以更快地加载图像吗?
提前致谢。