C# 为什么我的动画线程运行得这么慢

C# 为什么我的动画线程运行得这么慢,c#,multithreading,animation,user-interface,C#,Multithreading,Animation,User Interface,我目前正在创建一个GUI应用程序框架,作为Ionite框架的一部分。我将用它来做我的学校期末专题, 我的问题是: 我正在使用线程来维护动画 ParameterizedThreadStart iv = new ParameterizedThreadStart(o => { this.Size = (Size)o; }); new Thread(()=>{ float stepWidth = (targetWidth-currentWidth)/transition; flo

我目前正在创建一个GUI应用程序框架,作为Ionite框架的一部分。我将用它来做我的学校期末专题, 我的问题是:

我正在使用线程来维护动画

ParameterizedThreadStart iv = new ParameterizedThreadStart(o => {
  this.Size = (Size)o;
});
new Thread(()=>{
  float stepWidth = (targetWidth-currentWidth)/transition;
  float baseWidth = currentWidth;
  int tick=transition;
  while(tick-- > 0){
    baseWidth+=stepWidth;
    Invoke(iv,new Size(baseWidth,this.Height));
    Thread.Sleep(1);
  }
}).Start();
假设this操作符是一个控制对象。当我在我的控制对象上使用背景时,它比预期的要长

我的代码/方法有什么问题? 谢谢

那不是你所希望的。Sleep()方法只能在等于或是操作系统时钟周期分辨率整数倍的时间间隔内休眠。默认情况下,每秒滴答64次。或15.625毫秒。所以你的动画实际上比你想象的慢16倍

这在技术上是可以通过pinvoking timeBeginPeriod(1)修复的。但是你不应该,16毫秒足够让任何动画在人眼看来都是平滑的。只需将步长变量增大16倍即可。假设您的UI线程能够跟上所需的绘制级别


下一步是认识到使用线程是无用的,它仍然只能以调用()的速度运行。这要求UI线程具有足够的响应能力。因此,对于完全相同的结果,使用普通同步计时器,减去线程的开销。

你不能这样做。在UI线程上使用计时器。我在上面的问题上编辑了我的代码,因此可以安全地执行跨线程操作(我认为)不。从不同的线程操作UI控件是不安全的。计时器和线程之间有什么不同?计时器是否不使用线程使其非阻塞?是否有任何方法获得操作系统支持的延迟或最小滴答声?还有定时器和线程之间的区别是什么?计时器不也是一条线索吗?如果你理解我发布的答案,那么你就不应该对这些后续问题的答案感兴趣。如果愿意,您可以再次单击“提问”按钮询问他们。
Thread.Sleep(1);