如何在不阻塞主线程的情况下暂停C#代码执行?

时间:2012-11-30 08:13:01

标签: c# multithreading animation wait

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

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

1 个答案:

答案 0 :(得分:3)

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

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