Thread.Sleep()没有冻结UI

时间:2014-06-10 08:35:18

标签: c# thread-sleep

首先,我是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?

5 个答案:

答案 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();
            }
        }