2013-05-16 52 views
3

我试图禁用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正在睡觉,一切都我输入弹出,在TextBoxThread“醒来”。

我的问题是,如果有某种缓冲区在GUI线程休眠时存储所有引发的事件?

+6

你不应该睡觉UI线程。而是禁用文本框并安排任务以后重新启用它。 – Nick

+0

我意识到,睡觉的UI线程是不正确的选择,但我的问题是更多关于'Thread.Sleep'方法的工作原理。 – Yoav

+1

您正在睡觉UI线程,因此输入文本的关键事件将需要等待。此外,您可能会在2.5秒内发现您的用户界面无响应,即按Enter键然后尝试调整窗口大小。要回答你的问题没有缓冲,但他们将被阻止,因为他们都在你已经停止执行的一个线程上运行。 – TheKingDave

回答

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

你会看到,当您按下输入框被禁用,你是不是睡在UI线程上。

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