好的,所以我们有一个程序,我们希望在WinForm上设置控件的动画,然后恢复剩余代码块的后续操作。这是示例代码。
该函数在WinForm上,可能在主线程上运行
Private void DoThisWork();
{
do some work here
animateControls()
//<NEED TO PAUSE HERE WHILE THE GUI ANIMATES AND UPDATES DISPLAYING THE ANIMATION OF THE CONTROL>
//Tried Option 1: thread.sleep. When we do this the main thread blocks and the animation is //not seen. The control is directly painted at x1,y1 and thats it, the intermediate rendering is not seen
// Tried Option 2: Application.DoEvents. This works very well except that the CPU maxes out and the animation then appears very jittery
continue doing remaining work // must execute only after animateControls() completes the animation part.
}
现在,animateControls()
只是一个定时器上的函数,它将控件从点(x,y)移动到(x1,y1),这大约需要3秒。
SuspendLayout和ResumeLayout不强制GUI更新,因为thread.sleep导致主线程被阻塞,所以一切都处于停顿状态。
使用不同的线程来动画GUI似乎没有帮助,因为我仍然需要完成整个动画。
另外,我无法在动画代码中添加任何内容,因为它是从多个函数调用的,因此用作常用函数。
答案 0 :(得分:3)
你走错了路。把你的工作放在一个单独的线程上,让你的UI线程做你的动画,直到工作线程结束。
BackgroundWorker类可能会派上用场。 http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx