2013-05-16 1 views
3

나는 사용자 후 초 커플에 대한 TextBox을 해제하기 위해 노력하고있어이 Enter 클릭하십시오 Thread 자고 때 내가 계속 입력하면실은 정말로 자지 않습니까?

<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 
     } 
    } 

이 모든 것을 내가 TextBox에 팝 업을 입력 할 때 Thread " 깨어나 라 ".

제 질문은 GUI 스레드가 잠자는 동안 발생하는 모든 이벤트를 저장하는 버퍼가 있습니까?

+6

UI 스레드를 실제로 자면 안됩니다. 오히려 텍스트 상자를 비활성화하고 나중에 다시 활성화하려면 작업을 예약하십시오. – Nick

+0

UI Sleeping은 올바른 선택이 아니라는 것을 알고 있습니다. 그러나 제 질문은 Thread.Sleep 메서드가 어떻게 작동하는지에 대한 것입니다. – Yoav

+1

입력 한 텍스트의 키 이벤트가 기다려야하므로 UI ​​스레드를 잠자고 있습니다. 또한이 2.5 초 동안 UI가 응답하지 않을 수도 있습니다. 즉, Enter 키를 누른 다음 창 크기를 조정 해보십시오. 버퍼링되지 않은 질문에 대답하기 위해하지만 그들은 모두 당신이 exectuing에서 중지 한 스레드에서 실행으로 차단됩니다. – 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(); 
    } 
} 

당신은 Enter 키를 누르면 상자가 비활성화하고 UI 스레드에서 자고하지 않는 것을 확인할 수 있습니다.

이 완료되면 다른 UI 요소가 알 수 있도록하려면 t (스레드)를 양식에 저장하고 상태 (t.ThreadState)를 쿼리하여 완료되었는지 확인하십시오.

관련 문제