2013-05-16 85 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)以確定它是否完成。