문제

UI 스레드가 WaitHandle 또는 기타 스레딩 기본 요소를 기다리는 동안 모든 Windows 메시지를 처리할 수 있는 방법이 있습니까?

나는 그것이 매우 지저분한 재진입 문제를 일으킬 수 있다는 것을 알고 있습니다.어쨌든 하고 싶어요.

편집하다:대기는 UI 스레드에서 실행되어야 하는 복잡한 기능 중에 발생합니다.따라서 대기를 백그라운드 스레드로 이동하는 것은 옵션이 아닙니다.(함수를 둘로 나누면 복잡하고 유지 관리가 불가능해집니다.)

도움이 되었습니까?

해결책

별도의 백그라운드 스레드에서 "분할할 수 없는 복잡한 기능" 전체를 실행하고 필요할 때만 GUI에 보고하도록 했습니다(컨트롤에서 Invoke/BeginInvoke 메서드 사용). .

보다 향상된 버전에서는 UI에 의존하지 않고 단위 테스트가 더 쉬운 비 UI 컨트롤러에서 복잡한 기능을 실행해야 합니다.UI를 다시 호출하고 UI에 결과를 표시하는 작업은 컨트롤러에서 제공하는 이벤트를 UI에서 구독하도록 하여 쉽게 접근할 수 있습니다.

다른 팁

대기를 수행하기 위해 다른 스레드를 생성하고 적절한 시점에 메시지(또는 기타)를 통해 UI 스레드에 알리도록 하면 어떨까요?

이는 차단 이벤트 중에 UI 스레드 메시지 처리를 허용하는 일반적인 접근 방식입니다.

편집하다:이제 알겠습니다. UI 코드에 앱 논리 논리가 내장되어 있습니다.그렇다면 이것은 실제로 디자인 문제입니다.장기적으로 해당 기능을 UI에서 자체 포함 개체로 분리하고 일부 메커니즘을 사용하여 작업자의 UI와 상태를 통신하는 것이 더 좋습니다.

UI 코드를 UI에 집중시키는 이점 외에도 논리 코드를 별도로 단위 테스트할 수 있습니다.

C#에 대해서는 잘 모르겠지만 일반 Win32 프로그래밍에서는 실제 대기를 위해 MsgWaitFor...() 함수 중 하나를 사용할 수 있습니다.메시지 대기열에 메시지가 있을 때와 대기 중인 개체가 신호를 받을 때 알려줍니다.메시지가 있다고 보고되면 GetMessage(), TranslateMessage() 및 DispatchMessage()를 호출하여 메시지를 처리한 다음 다시 대기 상태로 돌아갈 수 있습니다.

일반적으로 대기 조건을 다른 스레드에 두는 것이 좋습니다.

그러나 언제든지 전화할 수 있습니다. Application.Do이벤트 대기 핸들에서 "대기"하는 동안(대기 핸들을 "통과"할 때까지 시간 초과, 이벤트 수행, 시간 초과 대기 등)을 포함하여 언제든지 메시지 펌프를 처리합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top