C# 在for循环中睡眠以创建平滑效果
我想创建一个for循环,它会在一秒钟内慢慢改变我的形状,从而创建一个平滑的效果。使用下面的代码,我在读取“Then name‘Thread’在当前上下文中不存在”时出错。有人能帮我吗C# 在for循环中睡眠以创建平滑效果,c#,C#,我想创建一个for循环,它会在一秒钟内慢慢改变我的形状,从而创建一个平滑的效果。使用下面的代码,我在读取“Then name‘Thread’在当前上下文中不存在”时出错。有人能帮我吗 for (var i = 1; i > 221; i++ ) { Form1.ActiveForm.Height += 1; Application.DoEvents(); Thread.Sleep(4.5); } 您需要理解它以毫秒为单位获取一个值。所以4.5是一个很短的时间来判断
for (var i = 1; i > 221; i++ )
{
Form1.ActiveForm.Height += 1;
Application.DoEvents();
Thread.Sleep(4.5);
}
您需要理解它以毫秒为单位获取一个值。所以4.5是一个很短的时间来判断它是否睡觉 你最好做点像这样的事情
System.Threading.Thread.Sleep(200);
//Change 200 to some value which you want.
我还建议你用定时器代替线程。睡眠
Timer timer = new Timer(o => Application.DoEvents(), null, 4500, -1);
您需要确保已在文件顶部导入System.Threading,或将代码更改为:
System.Threading.Thread.Sleep(4)代码>
Sleep方法采用整数或Timespan,因此,如果确实需要4.5ms的睡眠间隔,请尝试:
System.Threading.Thread.Sleep(TimeSpan.fromsmillisecods(4.5))
在GUI线程中睡眠是个坏主意,因为这会抑制正常的事件处理代码,例如,使GUI保持绘制状态并使GUI控件保持响应。相反,使用System.Windows.Forms.Timer
的时间间隔与您在Timer.Tick的事件处理程序中睡眠和工作的时间间隔相同
编辑:我刚刚注意到您的代码调用了Application.DoEvents()
,这缓解了UI冻结问题,但也有自己的问题。如果您非常确定在程序中使用动画,并且动画是其中的一个重要部分,我认为最好花些时间学习WPF的动画系统
可以在此处找到一个示例:
向您展示它的诀窍,在这样一个答案的边界内是有点困难的。
不过,有些建议是,如果在动画运行时使用动画,并且代码的某些部分正在执行一些长时间运行的操作,请100%确保在后台线程而不是GUI线程上执行长时间运行的操作,因为动画已经在GUI线程上运行。如果不这样做,将不会产生预期的结果。
这个问题的可能解决方案是使用async,如果您能胜任,请等待backgroundworker或classic线程。就我个人而言,我尝试使用async并等待。但是,如果您已经学习了WPF,还需要异步和等待,那么您将有相当多的工作要做
另一方面,如果你只是想要一个没有任何其他逻辑的花式动作,你会发现WPF真的很快就能让你开始
顺便说一句,只要做对了,你就不需要任何thread.sleep或doevent之类的东西。添加usingsystem.Threading;并给sleep一个毫秒长的值线程。永远不要在UI线程上执行sleep
。切换到计时器
或更好的WPF,它在执行调整大小或移动等操作时支持平滑。Sleep()和DoEvents()都不是好主意。计时器的分辨率约为20毫秒,Sleep()也是如此。Henk是正确的,这绝对是解决此问题的错误方法。这是解决问题的常见方法,但在许多方面都是一种糟糕的编程实践。特别是,如果您不理解DoEvents导致重新进入错误的原因,则不应使用它。你雇了那根线为你工作;使用的程序员不理解它是如何工作的。理解它是如何工作的程序员永远不会使用它代码>在220次迭代中每次睡眠4.5秒不是一个好方法idea@ASh:-哦,科蒙..时间可以改变。关键是4.5毫秒太小,无法判断线程是否处于休眠状态。所需的值是4.5毫秒。我不明白4500毫秒如何更好地创建平滑的线程effect@ASh:-所需的值是4.5毫秒。
写在哪里?4.5太小了,但4500很可能太大了。该值最好放在op的左边,有些实验可能最适合定义正确的值。从200毫秒开始,一直持续到你满意为止。