为什么gif动画不开始动画在图片框c# windows应用程序

本文关键字:动画 windows 应用程序 gif 开始 为什么 | 更新日期: 2023-09-27 17:50:41

我正在编写简单的windows应用程序来调用任何数据,我已经这样做了,打开文件对话框并读取csv文件并完成,任何事情都可以,但我想改变我的应用程序一点,我想在文件读取过程中设置加载动画,我写这个代码:

var reader = new StreamReader(File.OpenRead(openFileDialog1.FileName), Encoding.GetEncoding(1256));
LoadForm frm = new LoadForm();
frm.Show();
Application.DoEvents();
while (!reader.EndOfStream)
{
}


然后在Load表单中放入图片框并设置加载gif图像,但是当我触发按钮并加载LoadForm时,该表单中的图片框没有动画图像并显示静态加载gif图像,但是当我复制该图片框时,图片框开始加载gif动画。
发生了什么?

为什么gif动画不开始动画在图片框c# windows应用程序

问题是呈现图片框需要应用程序处理它的消息。当你在UI线程上做长阻塞操作时,窗体不可能重新绘制自己(你阻塞了唯一一个可以进行绘制的线程)。

最简单的解决方案是避免在UI线程上做任何重要的工作(和/或阻塞)。您正在读取一个CSV文件——这可能是一个I/o受限的操作。如果您使用异步I/O来处理文件读取,您将避免阻塞同步I/O。使用await使这相当简单:

string line;
while ((line = await reader.ReadLineAsync()) != null)
{
  // Do your work
}

如果cpu部分的工作也是密集的,这仍然会导致你的动画"口吃"。为了处理这个问题,你可以确保整个加载和处理都是在没有回送回UI线程的情况下完成的(只有在绝对必要的时候才回送回UI线程)。一种方法是使用ConfigureAwait:

string line;
while ((line = await reader.ReadLineAsync().ConfigureAwait(false)) != null)
{
  // Do your work
}

请注意,您可能希望在单独的方法中分离不访问UI的代码-这将使您能够通过依次await该方法来编组回UI线程。

请注意,就像Application.DoEvents一样,这将打开代码的可重入性。然而,考虑到你显然以前使用过,它应该不会造成很多问题。当然,如果使用ConfigureAwait(false),通常的多线程警告也适用——您需要保持适当的同步等。