C# 在for循环中睡眠以创建平滑效果

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循环,它会在一秒钟内慢慢改变我的形状,从而创建一个平滑的效果。使用下面的代码,我在读取“Then name‘Thread’在当前上下文中不存在”时出错。有人能帮我吗

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毫秒开始,一直持续到你满意为止。