다음을 통해 공유


스레딩 문제 이해

이 항목에서는 Microsoft UI 자동화 클라이언트 구현에 대한 일반적인 스레딩 시나리오에 대해 설명하고 클라이언트가 스레딩을 잘못 사용하는 경우 발생할 수 있는 문제를 방지하는 방법을 설명합니다.

이 항목에는 다음과 같은 섹션이 포함되어 있습니다.

UI 자동화 및 UI 스레드

UI 자동화 Windows 메시지를 사용하는 방식 때문에 클라이언트 애플리케이션이 UI 스레드에서 자체 UI와 상호 작용하려고 할 때 충돌이 발생할 수 있습니다. 이러한 충돌로 인해 성능이 매우 느려지거나 애플리케이션의 응답이 중지될 수도 있습니다.

클라이언트 애플리케이션이 자체 UI를 포함하여 데스크톱의 모든 요소와 상호 작용하려는 경우 별도의 스레드에서 모든 UI 자동화 호출을 수행해야 합니다. 여기에는 예를 들어 IUIAutomationTreeWalker 또는 IUIAutomationElement::FindAll 메서드를 사용하고 컨트롤 패턴을 사용하여 요소를 찾는 것이 포함됩니다. 이 스레드는 창을 소유해서는 안 되며 COM(Component Object Model) MTA(Multithreaded Apartment) 모델 스레드여야 합니다(COINIT_MULTITHREADED 플래그를 사용하여 CoInitializeEx를 호출하여 COM을 초기화하는 스레드).

이벤트 처리기는 항상 비 UI 스레드에서 호출되므로 UI 자동화 이벤트 처리기에서 UI 자동화 호출하는 것이 안전합니다. 그러나 클라이언트 애플리케이션 UI에서 발생할 수 있는 이벤트를 구독하는 경우 비 UI 스레드(MTA 스레드여야 함)에서 IUIAutomation::AddAutomationEventHandler 또는 관련 메서드를 호출해야 합니다. 동일한 스레드에서 이벤트 처리기를 제거합니다.

UI 자동화 클라이언트는 여러 스레드를 사용하여 이벤트 처리기를 추가하거나 제거해서는 안 됩니다. 동일한 클라이언트 프로세스에서 다른 이벤트 처리기가 추가되거나 제거되는 동안 하나의 이벤트 처리기가 추가되거나 제거되는 경우 예기치 않은 동작이 발생할 수 있습니다.

이벤트 처리기에 대한 스레딩 모델

UI 자동화 클라이언트는 이벤트 처리기를 구현하는 스레드에 COM MTA 스레딩 모델을 사용해야 합니다. STA(단일 스레드 아파트먼트) 모델을 사용하면 클라이언트가 스레드에서 이벤트 처리기를 제거하지 못하게 하는 등의 문제가 발생할 수 있습니다.

64비트 Windows의 COM 아파트 선호도

COM 사양에 따라 원격 개체의 수명은 개체를 만들기 위해 CoCreateInstance 함수가 호출되는 아파트의 수명에 따라 제어됩니다. 원래 아파트가 종료되면 원격 개체도 해제됩니다.

UI 자동화 클라이언트의 경우 이 COM 동작은 32비트 요소에서 사용하는 원격 32/64 도우미(UIAutomationCore.dll 생성)의 수명이 요소를 만든 스레드의 아파트 수명에 의해 제어된다는 것을 의미할 수 있습니다. UI 자동화 클라이언트가 요소를 다른 스레드로 마샬링하는 경우 원래 아파트가 종료될 때 요소가 무효화될 수 있습니다. UI 자동화 클라이언트는 마샬링된 자동화 요소를 사용하는 동안 오류를 catch하여 이러한 문제를 정상적으로 처리해야 합니다.

64비트 요소가 있는 32비트 UI 자동화 클라이언트에서 동일한 문제가 발생할 수 있습니다.

개념

UI 자동화 요소 가져오기

UI 자동화 이벤트 구독

UI 자동화 이벤트 개요

기타 리소스

정보: OLE 스레딩 모델의 설명 및 작업