C# 如何在没有睡眠父窗体或其他子窗体的情况下睡眠子窗体

C# 如何在没有睡眠父窗体或其他子窗体的情况下睡眠子窗体,c#,sleep,mdiparent,C#,Sleep,Mdiparent,我正在构建一个总共有5个表单的程序。1个MDI容器和4个MDI子容器 我目前为每个孩子都有一个线程。sleep(1000)。执行操作时,我仍然需要其他3个MDIChild工作并可交互。但是,现在当调用线程.sleep(1000)时,整个程序将休眠1秒,我必须等待休眠完成,然后才能与任何其他窗体交互 有没有一种方法可以让你的睡眠形式单一化?如果是这样的话,请举例说明。你基本上不应该在UI线程中睡觉……永远……因为你的问题正好说明了这个原因 您只需要在1秒内执行一些代码。有两种有效的方法可以做到这一

我正在构建一个总共有5个表单的程序。1个MDI容器和4个MDI子容器

我目前为每个孩子都有一个
线程。sleep(1000)
。执行操作时,我仍然需要其他3个MDIChild工作并可交互。但是,现在当调用
线程.sleep(1000)
时,整个程序将休眠1秒,我必须等待休眠完成,然后才能与任何其他窗体交互


有没有一种方法可以让你的睡眠形式单一化?如果是这样的话,请举例说明。

你基本上不应该在UI线程中睡觉……永远……因为你的问题正好说明了这个原因

您只需要在1秒内执行一些代码。有两种有效的方法可以做到这一点:

1) 您可以使用
计时器
。通过使用
窗体
命名空间中的计时器,您可以确保它是在UI线程中触发的
勾选
事件,并且不需要执行任何特殊操作来与UI元素交互

private void Form1_Load(object sender, EventArgs e)
{
    label1.Text = "Loading . . .";

    var timer = new System.Windows.Forms.Timer();
    timer.Interval = 1000;

    timer.Tick += (s, args) =>
    {
        label1.Text = "Done!";
    };

    timer.Start();
}
正如您所看到的,这确实需要比理想情况多一点的代码,但它仍然有效

2) 如果您有.NET 4.5和C#5.0,您可以使用带有
wait
的任务使这项工作变得非常流畅和简单:

private async void Form1_Load(object sender, EventArgs e)
{
    label1.Text = "Loading . . .";
    await Task.Delay(1000); //wait 1 second, but don't block the UI thread.
    label1.Text = "Done!";
}

让你的UI进入睡眠状态一般来说没有什么意义。将窗体的Enabled属性设置为false。使用1秒计时器将其设置回true。thread.sleep(1000)用于延迟进程。在这个特殊的程序中,它会使一个picturebox更改图片1秒,然后再更改回去。我不希望表单在这1秒内可交互,因此需要睡眠。我一直不喜欢计时器,但您的示例非常简短、简单和甜美。然而,知道等待/延迟是一个惊喜。这个功能太棒了!简单明了,谢谢。请注意,第二个示例将生成与第一个示例非常相似的代码,只是让编译器和.NET库为您完成大部分工作。