Поделиться через


Поддержка потоков в Office

В этой статье содержатся сведения о том, как потоки поддерживаются в объектной модели Microsoft Office. Объектная модель Office не является потокобезопасной, но можно работать с несколькими потоками в решении Office. Приложение Office ликации — это серверы объектной модели компонентов (COM). COM позволяет клиентам вызывать COM-серверы на произвольных потоках. Для COM-серверов, которые не являются потокобезопасным, COM предоставляет механизм сериализации одновременных вызовов, чтобы в любое время выполнялось только один логический поток на сервере. Этот механизм называется моделью однопоточной квартиры (STA). Так как вызовы сериализуются, вызывающие пользователи могут быть заблокированы в течение определенного периода времени, пока сервер занят или обрабатывает другие вызовы в фоновом потоке.

Область применения. Сведения в этом разделе относятся к проектам уровня документа и проектам надстроек VSTO. См. сведения о функциях, доступных по Приложение Office и типу проекта.

Знания, необходимые при использовании нескольких потоков

Для работы с несколькими потоками необходимо иметь по крайней мере базовые знания о следующих аспектах многопоточности:

  • API Windows

  • Многопоточные понятия COM

  • Параллелизм

  • Синхронизация

  • Маршалинг

    Общие сведения о многопоточности см. в разделе "Управляемый поток".

    Office выполняется в основном STA. Понимание последствий этого позволяет понять, как использовать несколько потоков с Office.

Базовый сценарий многопоточности

Код в решениях Office всегда выполняется в основном потоке пользовательского интерфейса. Вы можете сгладить производительность приложения, выполнив отдельную задачу в фоновом потоке. Цель состоит в том, чтобы выполнить две задачи, казалось бы, одновременно вместо одной задачи, за которой следует другая, что должно привести к более плавному выполнению (основная причина использования нескольких потоков). Например, у вас может быть код события в основном потоке пользовательского интерфейса Excel, а в фоновом потоке можно выполнить задачу, которая собирает данные с сервера и обновляет ячейки в пользовательском интерфейсе Excel с данными с сервера.

Фоновые потоки, вызывающие объектную модель Office

Когда фоновый поток вызывает Приложение Office ликацию, вызов автоматически маршалируется через границу STA. Однако нет никаких гарантий, что Приложение Office ликация может обрабатывать вызов во время фонового потока. Существует несколько возможностей:

  1. Приложение Office ликация должна перекачивать сообщения для вызова, чтобы иметь возможность ввести. Если она выполняет тяжелую обработку без получения этого может занять время.

  2. Если другой логический поток уже находится в квартире, новый поток не может ввести. Это часто происходит, когда логический поток входит в Приложение Office ликацию, а затем выполняет повторный вызов к квартире вызывающего объекта. Приложение блокируется, ожидая возврата этого вызова.

  3. Excel может находиться в состоянии, так что он не может немедленно обрабатывать входящие вызовы. Например, Приложение Office ликация может отображать модальное диалоговое окно.

    Для возможностей 2 и 3 COM предоставляет интерфейс IMessageFilter . Если сервер реализует его, все вызовы вступают через метод HandleIncomingCall . Для возможности 2 вызовы автоматически отклоняются. Для возможности 3 сервер может отклонить вызов в зависимости от обстоятельств. Если звонок отклонен, вызывающий должен решить, что делать. Как правило, вызывающий объект реализует IMessageFilter, в этом случае он будет уведомлен об отклонении методом RetryRejectedCall .

    Однако в случае решений, созданных с помощью средств разработки Office в Visual Studio, COM-взаимодействие преобразует все отклоненные вызовы в COMException "Фильтр сообщений, указывающий, что приложение занято"). При вызове объектной модели в фоновом потоке необходимо подготовиться к обработке этого исключения. Как правило, это включает повторную попытку в течение определенного времени, а затем отображение диалогового окна. Однако вы также можете создать фоновый поток как STA, а затем зарегистрировать фильтр сообщений для этого потока для обработки этого дела.

Правильное запуск потока

При создании нового потока STA задайте для состояния квартиры значение STA перед запуском потока. В следующем примере кода показано, как это сделать.

System.Threading.Thread t = new System.Threading.Thread(AnObject.aMethod);

t.SetApartmentState(System.Threading.ApartmentState.STA);
t.Start();

Дополнительные сведения см. в рекомендациях по управлению потоками.

Безрежимные формы

Безрежимная форма позволяет некоторому типу взаимодействия с приложением во время отображения формы. Пользователь взаимодействует с формой, а форма взаимодействует с приложением без закрытия. Объектная модель Office поддерживает управляемые формы без режима; однако они не должны использоваться в фоновом потоке.