예, 실제로 문제에 관한 이론은 위의 의견 교환에서 나 자신과 madmik3이 제안한 이론과 일치합니다. UI 스레드에서 응용 프로그램이 수행하는 작업량은 효과적으로 사용자가 키 입력을 포함한 다른 이벤트를 처리하는 것을 차단합니다. 그것들은 당신의 어플리케이션이 시간 소모적 인 포 그라운드 작업을 끝내면 나중에 실행을 위해 큐잉됩니다. 그것들은 현대의 선제 멀티 태스킹 OS의 위험입니다. 물론 실제 코드를 게시하지 않고서는 내가 경험 한 것보다 문제가 무엇인지 추측 할 수 있습니다.
실제로 이것이 사실인지 확인하는 빠른 확인은 처리 루프에 Application.DoEvents
을 던지기위한 것입니다. 그러면 OS가 키 스트로크를 즉시 처리 할 수있게되며 버튼이 비활성화되어 모두 실패합니다. (Click
이벤트는 마우스 또는 키보드 바로 가기로 시작하여 Button
컨트롤의 경우 Enabled
속성이 "False"로 설정되어 있지 않은 경우 발생합니다.) "버퍼 플러시"와 가장 비슷합니다. 장기 실행 작업이 완료 될 때까지 KeyDown
또는 KeyPress
이벤트를 수신하는 것으로 의심됩니다.
문제가 해결되면 장기적인 해결책은 새 스레드를 생성하고 UI 스레드 대신 처리해야하는 모든 작업을 수행하는 것입니다. 이렇게하면 UI 스레드를 차단하지 못하며 Button
컨트롤이 올바르게 사용되지 않는다고 가정하면 "클릭하는"버튼을 클릭 할 수없는 상태에 있기 때문에 키 입력이 버려 질 수 있습니다. 새 스레드를 만드는 가장 간단한 방법은 BackgroundWorker
component입니다. 문서에는 꽤 좋은 예가 들어 있습니다.
버튼을 누르면 해당 버튼을 누르면 해당 키 스트로크가 푸시됩니다. 다시 활성화하기 전에 ['Application.DoEvents'] (http://msdn.microsoft.com/en-us/library/system.windows.forms.application.doevents.aspx)를 시도하십시오. –
당신이하고있는 일은 사용자 인터페이스 스레드를 풀고 메시지 펌프를 계속 유지하기 위해 자신의 스레드에서 실행하고 싶을 수도 있습니다. Application.DoEvents가 도움이 될 수 있습니다. 하지만 다른 스레드도 좋은 생각처럼 보입니다. – madmik3
@ madmik3 : 새 스레드 만들기에 동의했습니다. 'Application.DoEvents'는 다소 해킹입니다. 멀티 스레딩은보다 세련된 솔루션입니다. @ Jacob :하지만 먼저 UI 차단이 실제로 문제인지 확인해야합니다. 당신이 다른 모든 것을 올바르게하고 있다는 것은 질문에서 분명하지 않습니다. –