UI 자동화 클라이언트의 캐싱
참고 |
---|
이 문서는 System.Windows.Automation 네임스페이스에 정의된 관리되는 UI Automation 클래스를 사용하려는 .NET Framework 개발자를 위해 작성되었습니다.UI Automation에 대한 최신 정보는 Windows Automation API: UI Automation을 참조하십시오. |
이 항목에서는 UI Automation 속성 및 컨트롤 패턴의 캐싱에 대해 소개합니다.
UI Automation에서 캐싱은 데이터를 미리 페치한다는 의미입니다. 이렇게 미리 페치한 데이터는 추가 프로세스 간 통신 없이 액세스할 수 있습니다. 캐싱은 일반적으로 UI 자동화 클라이언트 응용 프로그램에서 속성 및 컨트롤 패턴을 대량으로 검색하는 데 사용됩니다. 캐싱한 후에는 필요할 때 캐시에서 정보를 검색합니다. 응용 프로그램은 대개 user interface (UI)에서 변경한 사항을 알리는 이벤트에 대한 응답으로 캐시를 주기적으로 업데이트합니다.
캐싱의 이점은 서버 쪽 UI 자동화 공급자가 있는 사용자 지정 컨트롤과 Windows Presentation Foundation (WPF) 컨트롤에서 가장 크게 나타납니다. 이에 비해 Win32 컨트롤의 기본 공급자와 같은 클라이언트 쪽 공급자에 액세스할 때는 캐싱의 이점이 크지 않습니다.
응용 프로그램이 CacheRequest를 활성화한 후 FindFirst, FindAll 등과 같이 AutomationElement를 반환하는 메서드나 속성을 사용할 경우 캐싱이 발생합니다. TreeWalker 클래스의 메서드는 예외로, CacheRequest가 매개 변수로 지정된 경우(예: TreeWalker.GetFirstChild(AutomationElement, CacheRequest))에만 캐싱이 수행됩니다.
CacheRequest가 활성 상태인 동안 이벤트를 구독하는 경우에도 캐싱이 발생합니다. 이벤트 처리기에 이벤트 소스로 전달된 AutomationElement에는 원래 CacheRequest에서 지정한 캐시된 속성과 패턴이 들어 있습니다. 따라서, 이벤트를 구독한 후 CacheRequest에 변경되는 사항은 모두 아무런 영향을 주지 않습니다.
UI Automation 속성과 컨트롤 패턴은 캐시할 수 있는 요소입니다.
이 항목에는 다음 단원이 포함되어 있습니다.
- 캐싱 옵션
- CacheRequest 활성화
- 캐시된 속성 검색
- 캐시된 컨트롤 패턴 검색
- 캐시된 자식 및 부모 검색
- 캐시 업데이트
- 관련 항목
캐싱 옵션
CacheRequest는 다음과 같은 캐싱 옵션을 지정합니다.
캐시할 속성
요청을 활성화하기 전에 각 속성의 Add(AutomationProperty)를 호출하여 캐시할 속성을 지정할 수 있습니다.
캐시할 컨트롤 패턴
요청을 활성화하기 전에 각 패턴의 Add(AutomationPattern)를 호출하여 캐시할 컨트롤 패턴을 지정할 수 있습니다. 패턴이 캐시될 때 그 속성이 자동으로 캐시되는 것은 아니므로 CacheRequest.Add를 사용하여 캐시할 속성을 지정해야 합니다.
캐싱 범위 및 필터링
요청을 활성화하기 전에 CacheRequest.TreeScope 속성을 설정하여 속성과 패턴을 캐시하려는 요소를 지정할 수 있습니다. 범위는 요청이 활성화된 동안 검색되는 요소에 상대적입니다. 예를 들어 Children만 설정한 후 AutomationElement를 검색하면 해당 요소의 자식 요소에 대한 속성과 패턴은 캐시되지만 요소 자체의 속성과 패턴은 캐시되지 않습니다. 검색된 요소 자체에 캐싱이 수행되게 하려면 TreeScope 속성에 Element를 포함해야 합니다. 범위를 Parent 또는 Ancestors로 설정할 수는 없지만, 자식 요소를 캐시할 때 부모 요소를 캐시할 수는 있습니다. 자세한 내용은 이 항목의 캐시된 자식 및 부모 검색을 참조하십시오.
캐싱 범위는 CacheRequest.TreeFilter 속성의 영향도 받습니다. 기본적으로 UI Automation 트리의 컨트롤 뷰에 나타나는 요소에만 캐싱이 수행됩니다. 그러나 이 속성을 변경하여 모든 요소에 캐싱을 적용하거나 콘텐츠 뷰에 나타나는 요소에만 캐싱을 적용할 수도 있습니다.
요소 참조의 장점
AutomationElement를 검색할 때 기본적으로 캐시되지 않은 속성과 패턴을 비롯하여 해당 요소의 모든 속성과 패턴에 액세스할 수 있습니다. 하지만 효율성을 높이기 위해 CacheRequest의 AutomationElementMode 속성을 None으로 설정하여 요소에 대한 참조가 캐시된 데이터만 참조하도록 지정할 수 있습니다. 이 경우에는 검색된 요소의 캐시되지 않은 속성과 패턴에 액세스할 수 없습니다. 즉, GetCurrentPropertyValue, AutomationElement의 Current 속성 또는 어떠한 컨트롤 패턴을 사용해도 속성에 액세스할 수 없으며 GetCurrentPattern 또는 TryGetCurrentPattern을 사용하여 패턴을 검색할 수도 없습니다. 캐시된 패턴에서 SelectionPattern.SelectionPatternInformation.GetSelection 같은 배열 속성을 검색하는 메서드를 호출할 수 있지만 InvokePattern.Invoke 같은 해당 컨트롤에 작업을 수행하는 메서드는 호출할 수 없습니다.
개체에 대한 전체 참조가 필요 없는 응용 프로그램의 예는 창에서 요소의 Name 및 ControlType 속성을 미리 페치해야 하지만 AutomationElement 개체 자체는 필요 없는 화면 판독기입니다.
CacheRequest 활성화
현재 스레드의 CacheRequest가 활성 상태일 때 AutomationElement 개체를 검색하는 경우에만 캐싱이 수행됩니다. CacheRequest를 활성화하는 방법은 두 가지입니다.
일반적인 방법은 Activate를 호출하는 것입니다. 이 메서드는 IDisposable을 구현하는 개체를 반환합니다. 요청은 IDisposable 개체가 존재하는 동안 활성 상태로 유지됩니다. 개체의 수명을 제어하는 가장 쉬운 방법은 호출을 using(C#) 또는 Using(Visual Basic) 블록으로 둘러싸는 것입니다. 이렇게 하면 예외가 발생하는 경우에도 요청이 스택에서 팝됩니다.
캐시 요청을 중첩하려는 경우에 유용한 다른 방법은 Push를 호출하는 것입니다. 이 호출은 요청을 스택에 배치하고 활성화합니다. 요청은 Pop을 사용하여 스택에서 제거될 때까지 활성 상태로 유지됩니다. 이러한 요청은 스택에 다른 요청이 푸시되는 경우 일시적으로 비활성화됩니다. 스택에서는 맨 위 요청만 활성화됩니다.
캐시된 속성 검색
다음과 같은 메서드와 속성을 통해 요소의 캐시된 속성을 검색할 수 있습니다.
요청된 속성이 캐시에 없으면 예외가 발생합니다.
Cached는 Current와 마찬가지로 개별 속성을 구조체의 멤버로 노출합니다. 하지만 개별 속성에 직접 액세스할 수 있으므로 이 구조체를 검색할 필요는 없습니다. 예를 들어 Name 속성을 element.Cached.Name에서 가져올 수 있습니다. 여기서 element는 AutomationElement입니다.
캐시된 컨트롤 패턴 검색
다음과 같은 메서드를 통해 요소의 캐시된 컨트롤 패턴을 검색할 수 있습니다.
패턴이 캐시에 없는 경우 GetCachedPattern은 예외를 발생시키고 TryGetCachedPattern은 false를 반환합니다.
컨트롤 패턴 개체의 Cached 속성을 사용하면 해당 패턴의 캐시된 속성을 검색할 수 있습니다. 그러나 AutomationElement를 검색할 때 None을 지정하지 않은 경우에 한해서는 Current 속성을 통해 현재 값을 검색할 수도 있습니다. 이 경우 기본값은 현재 값에 대한 액세스를 허용하는 Full입니다.
캐시된 자식 및 부모 검색
AutomationElement를 검색하고 요청의 TreeScope 속성을 통해 해당 요소의 자식에 대한 캐싱을 요청한 경우 검색한 요소의 CachedChildren 속성에서 자식 요소를 가져올 수 있습니다.
캐시 요청 범위에 Element가 포함되어 있다면 이후에 모든 자식 요소의 CachedParent 속성에서 요청의 루트 요소를 사용할 수 있습니다.
참고 |
---|
요청의 루트 요소에 대한 부모나 상위 항목은 캐시할 수 없습니다. |
캐시 업데이트
캐시는 UI에 변경 사항이 없는 동안에만 유효합니다. 대개 이벤트에 대한 응답으로 캐시를 업데이트하는 작업은 응용 프로그램에서 수행합니다.
CacheRequest가 활성 상태인 동안 이벤트를 구독한 경우에는 이벤트 처리기 대리자를 호출할 때마다 이벤트 소스로 캐시가 업데이트된 AutomationElement를 가져옵니다. 또한 GetUpdatedCache를 호출하여 요소의 캐시 정보를 업데이트할 수 있습니다. 원래 CacheRequest를 전달하여 이전에 캐시된 모든 정보를 업데이트할 수 있습니다.
캐시를 업데이트해도 기존 AutomationElement 참조에 대한 속성은 변경되지 않습니다.