我正在用 C# 编写一个 WinForms 窗口,它显示大约 12 个ListBox
和 6 个ComboBox
控件,每个控件有几百到几千个项目。
填充这些需要一点时间。没多久——只有几秒钟,但用户可以看到一些东西是件好事,这样他们就知道程序在等待时正在后台运行。
我有一个通用的“请稍候”动画无边框最顶层窗口,在发生这种情况时会出现,但是我在动画方面遇到了问题。
对于大多数需要一点时间的任务,我通过以下方式解决这个问题:
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()
在每个循环中插入大约一百个左右的插入之外,我还能做些什么来让工作动画在控件被填充时继续?