首先,我是C#
的初学者,我想这样做:
class2.method_79(null, RoomItem_0, num, num2, 0, false, true, true);
System.Threading.Thread.Sleep(250);
class2.method_79(null, RoomItem_0, num, num4, 0, false, true, true);
System.Threading.Thread.Sleep(300);
class2.method_79(null, RoomItem_0, num, num6, 0, false, true, true);
但是这个解决方案冻结了UI,我怎么能在第一个事件发生后250ms发生第二个事件而不冻结UI?
答案 0 :(得分:13)
在不冻结UI线程的情况下使用sleep的最简单方法是使方法异步。要使您的方法异步,请添加 async 修饰符。
private void someMethod()
到
private async void someMethod()
现在,您可以使用await运算符来执行异步任务。
await Task.Delay(milliseconds);
这使它成为asynchronous方法,并将从您的UI线程异步运行。
请注意,这仅在Microsoft .NET framework 4.5及更高版本中受支持。
答案 1 :(得分:2)
您可以使用Dispatcher Timer来计算方法的执行时间。
答案 2 :(得分:2)
当您致电.Sleep();
时,您处于UI线程中。
这就是它冻结用户界面的原因。如果您需要在不冻结UI的情况下执行此操作,则需要在单独的线程中运行代码。
答案 3 :(得分:0)
在单独的线程上运行耗时的任务。在UI线程上避免使用耗时的任务和Thread.Sleep()
。
答案 4 :(得分:0)
尝试此代码
public static void wait(int milliseconds)
{
System.Windows.Forms.Timer timer1 = new System.Windows.Forms.Timer();
if (milliseconds == 0 || milliseconds < 0) return;
timer1.Interval = milliseconds;
timer1.Enabled = true;
timer1.Start();
timer1.Tick += (s, e) =>
{
timer1.Enabled = false;
timer1.Stop();
};
while (timer1.Enabled)
{
Application.DoEvents();
}
}