线程没有真正睡觉?

时间:2013-05-16 07:48:43

标签: c# wpf thread-sleep

用户点击TextBox后,我尝试停用Enter几秒钟:

<StackPanel>
    <TextBox x:Name="txt1" Width="150" Margin="10" KeyUp="txt1_KeyUp"/>
</StackPanel>   

private void txt1_KeyUp(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.Enter)
        {
            txt1.IsEnabled = false;
            Thread.Sleep(2500);
            txt1.IsEnabled = true; //all text is added here
        }
    }

如果我在Thread正在睡觉时继续输入内容,那么当TextBox“唤醒”时,我输入的所有内容都会弹出Thread

我的问题是,当GUI线程处于休眠状态时,是否存在某种缓冲区存储所有引发的事件?

1 个答案:

答案 0 :(得分:2)

这是一个更好的解决方案:

<StackPanel>
    <TextBox x:Name="txt1" Width="150" Margin="10" KeyUp="txt1_KeyUp"/>
</StackPanel>   

private void txt1_KeyUp(object sender, KeyEventArgs e)
{
    if (e.Key == Key.Enter)
    {
        txt1.IsEnabled = false;
        Thread t = new Thread(() =>
        {
            System.Threading.Thread.Sleep(2500);
            Action action = () => txt1.IsEnabled = true;
            Dispatcher.Invoke(action);
        });
        t.Start();
    }
}

您会看到,当您按Enter键时,该框被禁用,您没有在UI线程上睡觉。

如果您希望其他UI元素知道何时完成,您可以将t(线程)保存到表单中,您可以查询它的状态(t.ThreadState)以确定它是否已完成。