-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动画似乎没有帮助,因为我仍然需要整个动画才能完成。
此外,我不能在动画代码中添加任何内容,因为它是从多个函数调用的,因此用作常用函数。
其实DoThisWork()是一个非常大的功能,有许多开关情况。只有在这些情况下,动画才会发挥作用。我不能把DoThisWork()放在工作线程上。主要问题是DoEvents。当多个表单打开时,DoEvents一次只能动画一个表单! – JamesT
也许你可以将DoThisWork()重构为单独的方法。一旦长时间运行的操作必须完成,让这个工作在另一个线程上。同时使用UI线程动画您的窗口。从我提供的信息中我相信其他解决方案只会是解决方法,如果没有完整的代码,就很难讨论。重新思考整体方法 - 在UI线程上运行一些长时间运行的操作,并通过事件调用一些动画代码将很难像描述的那样工作。 –
是的,这是最后的追索权,但我希望避免这种情况! :) – JamesT