MAPI 中的线程

适用于:Outlook 2013 | Outlook 2016

线程是操作系统向其分配 CPU 时间的基本实体。 线程有自己的寄存器、堆栈、优先级和存储,但共享地址空间和处理资源(如访问令牌)。 线程还共享内存,一个线程读取另一个线程写入的内容。

MAPI 客户端使用以下通用线程模型。

线程模型 说明
单线程模型
所有对象都在单个线程上使用。
单元线程模型
对象只能在创建它的线程上使用。
免费线程或线程方模型
对象可以在任何线程上使用。

MAPI 使用自由线程模型,支持随时可在任何线程上使用的线程安全对象。 OLE 使用单元线程模型。 当创建对象的线程以外的线程需要使用该对象时,单元线程模型支持必须显式传输的对象。

OLE 用于将对象从一个线程传输到另一个线程的机制称为封送处理。 封送处理涉及存根对象和代理对象。 这些特殊对象将接口的参数打包到要封送的对象中,将这些参数传输到另一个线程,并在到达时将其解压缩。 当使用 OLE“轻型”远程过程调用(LRPC)将自由线程 MAPI 对象发送到另一个进程时,会出现两个多线程模型之间的冲突。 LRPC 通过将存根和代理接口与对象与其调用方之间的单元线程行为进行插接,将对象的语义从自由线程更改为单元线程。 了解 MAPI 中导致此冲突的情况可以帮助客户端和服务提供商防止出现问题。

可以访问 MAPI 对象:

  • 通过使用服务提供程序或链接到客户端进程的 MAPI(例如从 MAPILogonEx 返回的会话对象)返回的接口指针直接调用其方法。

  • 通过使用任何服务提供程序返回的接口指针(例如从 IMAPIFolder::CopyFolder 中的另一个文件夹复制的文件夹对象)间接调用其方法。

  • 通过回调函数,例如 IMAPIAdviseSink::OnNotify 方法传递给服务提供商或 建议 调用中的 MAPI,或者可以显示长时间操作进度的方法。