-3

好的,所以我们有一个程序,我们要在其中为 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 设置动画似乎没有帮助,因为我仍然需要完成整个动画。

此外,我无法在动画代码中添加任何内容,因为它是从多个函数调用的,因此被用作通用函数。

4

1 回答 1

3

你走错了路。把你的工作放在一个单独的线程上,让你的 UI 线程做你的动画,直到工作线程完成。

BackgroundWorker 类可能会派上用场。http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx

于 2012-11-30T08:24:36.037 回答