Потоки в MAPI
Область применения: Outlook 2013 | Outlook 2016
Поток — это базовая сущность, которой операционная система выделяет время ЦП. Поток имеет собственные регистры, стек, приоритет и хранилище, но использует адресное пространство и ресурсы обработки, такие как маркеры доступа. Потоки также совместно используют память, при этом один поток считывает то, что написал другой поток.
Клиенты MAPI используют следующие универсальные модели потоков.
Потоковая модель | Описание |
---|---|
Модель с одним потоком |
Все объекты используются в одном потоке. |
Модель потоков квартиры |
Объект можно использовать только в потоке, создав его. |
Модель свободного потока или стороннего потока |
Объект можно использовать в любом потоке. |
MAPI использует модель свободного потока, поддерживающую потокобезопасные объекты, которые можно использовать в любом потоке в любое время. OLE использует модель потоков квартиры. Модель потоков квартир поддерживает объекты, которые должны быть явно переданы, если поток, отличный от потока, создавшего объект, должен использовать этот объект.
Механизм, используемый OLE для передачи объектов из одного потока в другой, называется маршалингом. Маршалинг включает объект-заглушку и прокси-объект. Эти специальные объекты упаковывают параметры интерфейса в объекте для маршалинга, передают эти параметры в другой поток и распаковывают их по прибытии. Конфликт между двумя многопотоковой моделью возникает, когда объект MAPI свободного потока отправляется в другой процесс с помощью "упрощенного" удаленного вызова процедур OLE или LRPC. LRPC изменяет семантику объекта с свободного потока на потоки квартир, вмешав интерфейсы заглушки и прокси-сервера с поведением потоков квартиры между объектом и его вызывающим объектом. Осведомленность о ситуациях в MAPI, которые приводят к этому конфликту, может помочь клиентам и поставщикам услуг предотвратить возникновение проблем.
Доступ к объекту MAPI можно получить:
Путем прямых вызовов к своим методам с помощью указателя интерфейса, возвращаемого поставщиком услуг, или MAPI, связанного с процессом клиента, например объекта сеанса, возвращаемого из MAPILogonEx.
Посредством непрямых вызовов методов с помощью указателя интерфейса, возвращаемого любым поставщиком услуг, например объекта папки, скопированного из другой папки в IMAPIFolder::CopyFolder.
Через функцию обратного вызова, например метод IMAPIAdviseSink::OnNotify, передаваемый поставщику услуг или MAPI в вызове Совет , или методы, которые могут отображать ход выполнения длительной операции.