보고서 모드에서 ListView가있는 Windows Form이 있습니다. 뷰의 각 항목에 대해 장기 실행 작업을 수행해야하며 그 결과는 숫자입니다.MsgWaitForMultipleObjects와 동일한 C#은 무엇입니까?
네이티브 win32에서이 작업을 수행하는 방법은 각 항목에 대해 작업자 스레드를 만드는 것입니다 (당연히 나는 무제한의 스레드를 만들지 않습니다). 그런 다음 스레드 핸들 배열에 MsgWaitForMultipleObjects()를 작성합니다. 각 계산이 끝나면 스레드 신호와 기본 UI 스레드가 깨어나서 업데이트됩니다. 그 동안 UI 스레드가 응답 할 수 있도록 메시지를 전달합니다.
누구나 C#에서 어떻게 작동하는지 예제를 제공 할 수 있습니까? Monitor 개체를 살펴본 결과, 원하는대로 보이지 않거나 차단하는 동안 메시지를 보내지 않습니까?
감사합니다.
편집 : WaitHandler.WaitAny()가 실제로 메시지를 보내고있는 것으로 보입니다. CLR의 메시지 펌핑에 대해서는 cbrumme's treatise을 참조하십시오.
맞습니다. 모니터가 메시지를 보내지 않습니다. WaitHandle이 더보기 좋은 장소 일 수도 있지만 메시지를 펌핑하는 WaitHandle 메서드를 찾을 수 없습니다. – itowlson
그래, 나도 그걸 봤어. 여러 객체를 기다릴 필요가 없습니다. 하나의 이벤트 나 다른 것을 기다리는 데 걸릴 것입니다. UI를 차단하고 싶지 않습니다. 내가 찾은 모든 샘플은 '슬립 (sleep) (100)'이나 문맥 전환을 강제하는 무언가를합니다. 이것은 매우 슬픈 일입니다. –
WinForms에서 메시지 루프가 명확하지 않다는 것이 문제라고 생각합니다. 따라서 MsgWaitX를 직접 수행 할 수 없으므로 대신 이벤트를 발생시킬 수있는 무언가가 필요합니다. 예를 들어, 각 하위 작업을 BackgroundWorker로 실행하십시오 (sync 프리미티브는 잊어 버리십시오). – itowlson