我想创建一个for循环,它会在一秒钟内慢慢改变我的表单形状,以创建一个平滑的效果。使用下面的代码,我得到一个错误,读取'然后名称'线程'在当前上下文中不存在'。有人可以帮帮我吗?
for (var i = 1; i > 221; i++ )
{
Form1.ActiveForm.Height += 1;
Application.DoEvents();
Thread.Sleep(4.5);
}
答案 0 :(得分:3)
睡在GUI线程中是一个坏主意,因为这会禁止正常的事件处理代码,例如,保持GUI绘制并保持GUI控件的响应。相反,请使用与您睡眠时间相同的System.Windows.Forms.Timer
,并在Timer.Tick
的事件处理程序中完成工作。
编辑:我刚刚注意到您的代码调用Application.DoEvents()
,这可以缓解UI冻结问题,但却有自己的陷阱集。
答案 1 :(得分:2)
如果您非常确定在程序中使用动画,如果它是其中的一个重要部分,我认为花一些时间学习WPF的动画系统会更好。
可在此处找到一个示例:http://www.codeproject.com/Articles/23257/Beginner-s-WPF-Animation-Tutorial
向你展示它的绳索,在这样的答案边界上有点困难。
虽然有些建议,如果您使用动画并且代码的某些部分在动画运行时正在执行一些长时间运行,请100%确保在后台线程而不是GUI上执行长时间运行的操作线程,因为动画已经在GUI线程上运行。如果不这样做,就不会产生预期的结果。
这个问题的可能解决方案是使用async并等待,如果你是它,后台工作者或经典线程。我个人尝试使用异步和等待。但是如果你已经学习了WPF,并且还要学习async和等待,那么你还有很多工作要做。
另一方面,如果你只是想要一个没有任何其他逻辑的奇特运动,你会发现WPF真的很快就能让你前进。
顺便说一下,你不需要任何thread.sleep或doevent的东西。
答案 2 :(得分:1)
您需要确保已在文件顶部导入System.Threading,或将代码更改为:
System.Threading.Thread.Sleep(4);
Sleep方法采用整数或Timespan,因此如果您真的需要4.5ms的睡眠间隔,请尝试:
System.Threading.Thread.Sleep(TimeSpan.FromMillisecods(4.5))
答案 3 :(得分:-1)
您需要了解Thread.Sleep取值为毫秒。所以4.5是通过小时间来判断它是否会睡觉。
您可以更好地执行类似
的操作System.Threading.Thread.Sleep(200);
//Change 200 to some value which you want.
另外我建议您使用Timer而不是Thread.Sleep
Timer timer = new Timer(o => Application.DoEvents(), null, 4500, -1);