2012-11-30 83 views
-3

好的,所以我们有一个程序,我们想要在WinForm上控制动画,然后恢复剩余代码块的后续操作。这里是示例代码。如何在不阻塞主线程的情况下暂停C#代码执行?

功能是对在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动画似乎没有帮助,因为我仍然需要整个动画才能完成。

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

回答

3

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

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

+0

其实DoThisWork()是一个非常大的功能,有许多开关情况。只有在这些情况下,动画才会发挥作用。我不能把DoThisWork()放在工作线程上。主要问题是DoEvents。当多个表单打开时,DoEvents一次只能动画一个表单! – JamesT

+0

也许你可以将DoThisWork()重构为单独的方法。一旦长时间运行的操作必须完成,让这个工作在另一个线程上。同时使用UI线程动画您的窗口。从我提供的信息中我相信其他解决方案只会是解决方法,如果没有完整的代码,就很难讨论。重新思考整体方法 - 在UI线程上运行一些长时间运行的操作,并通过事件调用一些动画代码将很难像描述的那样工作。 –

+0

是的,这是最后的追索权,但我希望避免这种情况! :) – JamesT

相关问题