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


Взаимодействие с диспетчером очереди MAPI

Область применения: Outlook 2013 | Outlook 2016

Методы в интерфейсе IXPLogon: IUnknown используются диспетчером очереди MAPI при вызове поставщика транспорта. Для большинства типов поставщиков транспорта должна быть возможность реализовать большинство из этих методов, чтобы они быстро возвращались. Это желательно, так как если для возврата метода требуется много времени, он должен быть разбит на вызовы обратной очереди MAPI, чтобы освободить ЦП для других задач.

Диспетчер очереди MAPI выполняет свою работу и вызывает поставщиков транспорта, когда приложения переднего плана простаивают. После дополнительного отображения диалоговых окон, когда поставщик транспорта впервые входит в систему (регулируется флагами, передаваемыми из MAPI поставщику транспорта), поставщики транспорта работают в фоновом режиме, если только клиент не вызывается для очистки очередей отправки и получения. Очистка очередей — это единственный раз, когда поставщику транспорта не нужно освобождать ЦП, а затем только в том случае, если пользователь будет уведомлен о потенциально длительном действии. Диспетчер очереди MAPI обычно запрашивает, чтобы поставщик транспорта сбрасывал свои очереди в ответ на действие пользователя, поэтому поставщику транспорта обычно не нужно ничего делать, чтобы убедиться, что пользователь был проинформирован.

Поставщик транспорта может самостоятельно решить очистить очередь и использовать STATUS_INBOUND_FLUSH и STATUS_OUTBOUND_FLUSH биты в свойстве PR_STATUS_CODE (PidTagStatusCode) строки состояния, чтобы сообщить диспетчеру очереди MAPI о том, что ему требуется внимание, чтобы выполнить задание. Строка состояния обновляется с помощью метода IMAPISupport::ModifyStatusRow . В этом случае поставщик транспорта, вероятно, должен отобразить индикатор хода выполнения или другой интерфейс, чтобы сообщить пользователю о том, что выполняется длительное действие.

Так как сетевая активность часто занимает более 0,2 секунды, поставщики транспорта должны по возможности использовать асинхронные сетевые запросы. Это позволяет им инициировать запрос, освобождать ЦП, вызывая диспетчер очереди MAPI, и когда диспетчер очереди MAPI снова предоставляет им управление, чтобы проверка, чтобы узнать, завершен ли их сетевой запрос. Если она еще не завершена, они снова освобождают ЦП, вызывая диспетчер очереди MAPI с помощью метода IMAPISupport::SpoolerYield .

Во время обработки сообщений между IXPLogon::SubmitMessage и IXPLogon::EndMessage и IXPLogon::StartMessage поставщик транспорта обычно выполняет много вызовов объектов, предоставляемых ему диспетчером spooooler MAPI. В рамках обработки этих объектов диспетчер очереди MAPI помогает поставщику транспорта вести себя соответствующим образом в качестве фонового процесса, предоставляя собственные возможности при необходимости. Поставщик транспорта, требующий критически важной по времени обработки, может объявить критический раздел в диспетчере очереди MAPI с помощью объекта поддержки IMAPISupport::SpoolerNotify . В этом случае ЦП освобождается только при явных вызовах SpoolerYield поставщиком транспорта, пока поставщик транспорта не завершит обработку критических разделов другим вызовом SpoolerNotify.

Примечание.

Это не то же самое, что критически важный раздел Win32. Это следует делать только в том случае, если поставщик транспорта нуждается в управлении внешними ресурсами в режиме реального времени, например чтением входящих данных из факсимильной линии. Так как это повышает приоритет процесса очереди MAPI и может привести к тому, что рабочая станция не отвечает на все время операции, рекомендуется уведомить пользователя о том, что выполняется потенциально длительное действие, и по возможности предоставить индикатор хода выполнения.