Кэширование в клиентах автоматизации пользовательского интерфейса

Обновлен: Ноябрь 2007

В этом разделе рассматривается кэширование свойств Модель автоматизации пользовательского интерфейса и шаблонов элементов управления. 

В Модель автоматизации пользовательского интерфейса кэширование означает предварительное кэширование данных. Последующий доступ к данным может осуществляться без дальнейшего обращения процессов друг к другу. Кэширование обычно используется в приложениях-клиентах автоматизации пользовательского интерфейса для извлечения свойств и шаблонов элементов управления одной операцией. Затем эта информация извлекается из кэша по мере необходимости. Приложение периодически обновляет кэш, обычно в ответ на события, указывающие на изменения в пользовательский интерфейс.

Преимущества кэширования наиболее заметны при использовании кэширования для элементов управления WPF (Windows Presentation Foundation) и настраиваемых элементов управления, имеющих серверных поставщиков автоматизации пользовательского интерфейса. Преимуществ при доступе к клиентским поставщикам, таким, как поставщики по умолчанию для элементов управления Win32, будет меньше. 

Кэширование происходит когда приложение активирует CacheRequest и затем использует любой метод или свойство, возвращающее AutomationElement; например FindFirst, FindAll. Методы класса TreeWalker являются исключением; кэширование выполняется только если CacheRequest указан как параметр (например, TreeWalker.GetFirstChild(AutomationElement, CacheRequest)).

Кэширование также происходит, когда произведена подписка на событие при активном CacheRequest. AutomationElement, переданный обработчику событий как источник события, содержит кэшированные свойства и шаблоны, заданные исходным CacheRequest. Любые изменения в CacheRequest произведенные после подписки на событие не вызывают кэширование.

Свойства Модель автоматизации пользовательского интерфейса и шаблоны элементов управления элемента могут кэшироваться.

В этом разделе содержатся следующие подразделы.

  • Параметры кэширования
  • Активация CacheRequest
  • Извлечение кэшированных свойств
  • Извлечение кэшированных шаблонов элемента управления
  • Извлечение кэшированных дочерних и родительских элементов
  • Обновление кэша
  • Связанные разделы

Параметры кэширования

CacheRequest задает следующие параметры кэширования.

Кэшируемые свойства

Кэшируемые свойства можно указать путем вызова Add(AutomationProperty) для каждого свойства перед активацией запроса.

Кэшируемые шаблоны элемента управления

Кэшируемые шаблоны элемента управления можно указать путем вызова Add(AutomationPattern) для каждого шаблона перед активацией запроса. При кэшировании шаблона его свойства не кэшируются автоматически; необходимо указать кэшируемые свойства с помощью CacheRequest.Add.

Область и фильтрация кэширования

Можно указать элементы, свойства и шаблоны которых нужно кэшировать, задав свойство CacheRequest.TreeScope перед активацией запроса. Область относится к элементам, которые извлекаются, когда запрос активен. Например, если установить только Children и затем извлечь элемент AutomationElement, то кэшироваться будут свойства и шаблоны потомков этого элемента, но не его самого. Чтобы выполнялось кэширование для самого полученного элемента, необходимо включить Element в свойство TreeScope. Нельзя задать для области значение Parent или Ancestors. Тем не менее, родительский элемент может быть кэширован, когда кэшируется дочерний элемент; см. подраздел "Извлечение кэшированных дочерних и родительских элементов" данного раздела.

На степень кэширования также влияет свойство CacheRequest.TreeFilter. По умолчанию кэширование выполняется только для элементов, отображаемых в дереве представления элементов управления модели Модель автоматизации пользовательского интерфейса. Тем не менее, можно изменить это свойство, чтобы кэшировать все элементы или только элементы, отображаемые в представлении содержимого.

Сила ссылок на элементы

При извлечении AutomationElement по умолчанию имеется доступ ко всем свойствам и шаблонам этого элемента, включая те, которые не кэшировались. Тем не менее, для повышения эффективности можно указать, что ссылка на элемент относится только к кэшированным данным, путем задания для свойства AutomationElementMode объекта CacheRequest значения None. В этом случае доступ к некэшированным свойствам и шаблонам извлеченного элемента отсутствует. Это означает, что нельзя получить доступ к свойствам с помощью GetCurrentPropertyValue или свойства Current объекта AutomationElement или любого шаблона элемента управления; также нельзя извлечь шаблон с помощью GetCurrentPattern или TryGetCurrentPattern. Для кэшированных шаблонов можно вызывать методы, извлекающие свойства массива, такие как SelectionPattern.SelectionPatternInformation.GetSelection, но нельзя вызывать методы, которые выполняют действия над элементом управления, например InvokePattern.Invoke.

Примером приложения, которому могут не потребоваться полные ссылки на объекты, является средство чтения с экрана, которое предварительно кэшировало бы свойства Name и ControlType элементов в окне, но не нуждалось бы в самих объектах AutomationElement.

Активация CacheRequest

Кэширование выполняется только если объекты AutomationElement извлекаются при активном CacheRequest для текущего потока. Существуют два способа активации CacheRequest.

Обычным способом является вызов Activate. Этот метод возвращает объект, который реализует IDisposable. Запрос остается активным, пока существует объект IDisposable. Наиболее простым способом управления временем существования объекта является заключение вызова в блок using (C#) или Using (Visual Basic). Это обеспечивает то, что запрос будет быть извлекаться из стека, даже если возникнет исключение.

Другим способом, полезным при вложении запросов кэширования, является вызов Push. При этом запрос помещается в стек и активируется. Запрос остается активным до тех пор, пока не будет удален из стека с помощью Pop. Запрос становится временно неактивным, если другой запрос помещается в стек; активен только верхний запрос в стеке.

Извлечение кэшированных свойств

Кэшированные свойства элемента можно извлечь с помощью следующих методов и свойств.

Исключение возникает, если запрошенное свойство не находится в кэше.

Cached как и Current предоставляет отдельные свойства как члены структуры. Тем не менее, нет необходимости извлекать эту структуру; можно получить доступ непосредственно к отдельным свойствам. Например, свойство Name можно извлечь из element.Cached.Name, где element является AutomationElement.

Извлечение кэшированных шаблонов элемента управления

Кэшированные шаблоны элемента управления элемента можно извлечь с помощью следующих методов.

Если шаблон не находится в кэше, GetCachedPattern вызывает исключение и TryGetCachedPattern возвращает значение false.

Можно извлечь кэшированные свойства шаблона элемента управления с помощью свойства Cached объекта шаблона. Можно также извлечь текущие значения с помощью свойства Current, но только если None не был задан при извлечении AutomationElement (Full является значением по умолчанию, что позволяет получить доступ к текущим значениям).

Извлечение кэшированных дочерних и родительских элементов

При извлечении AutomationElement и запросе кэширования дочерних элементов данного элемента с помощью свойства TreeScope запроса, можно позднее извлечь дочерние элементы из свойства CachedChildren извлеченного элемента.

Если Element был включен в область запроса кэширования, то впоследствии корневой элемент запроса доступен из свойства CachedParent любого из дочерних элементов.

ms750727.alert_note(ru-ru,VS.90).gifПримечание.

Нельзя кэшировать родителей или предков корневого элемента запроса.

Обновление кэша

Кэш действителен до первого изменения в Пользовательский интерфейс. За обновление кэша отвечает приложение, обычно это происходит в ответ на события.

При наличии подписки на события, до тех пор, пока CacheRequest активен, получение AutomationElement с обновленным кэшем как источником события происходит при каждом вызове делегата обработчика событий. Можно также обновлять кэшированную информацию для элемента путем вызова GetUpdatedCache. Также можно передать исходный CacheRequest, чтобы обновить всю информацию, которая была ранее кэширована.

Обновление кэша не изменяет свойств существующих ссылок AutomationElement.

См. также

Задачи

Использование кэширования в модели автоматизации пользовательского интерфейса

Пример FetchTimer

Основные понятия

События модели автоматизации пользовательского интерфейса для клиентов