我正在写一个WinForms窗口在C#中显示约12 ListBox
和6 ComboBox
控制每个有几百到几千项。显示请等待动画,而用户界面填充
需要一段时间来填充这些。时间不长 - 只需几秒钟,但用户有兴趣看一下,这样他们就知道程序在等待的时候在后台工作。
我有一个通用的“Please Wait”动画无边界顶部窗口,当这种情况发生时出现,但是我在动画方面遇到了问题。
对于那些需要一点时间的大部分任务,我解决这个问题的方式如下:
Program.ShowPleaseWait(); // Show top-most animation
Thread t = new Thread(stuffToDo); // Run stuffToDo() in separate thread
t.Start();
While (t.IsAlive)
Application.DoEvents(); // Run message queue, necessary for animation
Program.HidePleaseWait(); // Hide top-most animation
,它工作得很好。有时线程中的东西需要调用某些东西,有时会导致动画中出现小的呃逆,但这通常不是什么大问题。
但是,通过这种形式,线程中的整个代码都是UI代码:填充ListBoxes和ComboBoxes。这意味着所有的东西都必须包含在Invoke块中,这没有任何意义,因为没有必要让它首先在单独的线程中运行。
除了为这个特殊情况报废整个工作线程,并在每个循环中每隔几百次插入一个Application.DoEvents()
,我有什么办法可以在控件填充时允许工作动画继续?
工程很棒。感谢那! – Ozzah
事实上,我已经完成并替换了我的代码的所有实例以使用您的方法。 – Ozzah
@Ozzah:很高兴你发现它很有用。 –