适用于:Outlook 2013 | Outlook 2016
MAPI 提供了多个统称为空闲引擎的函数。 这些函数允许客户端、通讯簿提供程序和消息存储提供程序在会话中的缓慢时间或响应慢时间执行各种任务。 例如,客户端和服务提供商可以延迟慢速操作或关闭长时间未使用的文件。 传输提供程序通常不使用空闲引擎,因为 IXPLogon::Idle 方法取代了它。 有关详细信息,请参阅 IXPLogon::Idle。
若要使用空闲引擎,客户端和服务提供商会创建一个回调函数,其中包含在 MAPI 子系统空闲时应发生的任务。 当 MAPI 检测到空闲时间时,它会调用此回调函数。 回调函数遵循 FNIDLE 原型,定义如下:
BOOL (STDAPICALLTYPE FNIDLE) (LPVOID lpvContext)
有关详细信息,请参阅 FNIDLE。
构成空闲引擎的函数包括:
若要注册回调函数,客户端和服务提供程序调用 FtgRegisterIdleRoutine 函数。 输入参数包括可选的优先级、作为输入传递给回调函数的内存块、以任何适当的方式使用的时间量以及一组选项标志。
客户端和服务提供商可以在控制空闲函数运行方式的 priIdle 参数中指定优先级,或者在优先级不是问题时指定零。 由于负数表示的优先级高于正数或零,因此压缩和搜索操作应分配负数。 应为发生一次的任务分配正数。
若要取消注册活动回调函数,客户端和服务提供程序调用 DeregisterIdleRoutine 函数。 由于 DeregisterIdleRoutine 以异步方式运行,因此在取消注册调用期间随时可能调用回调函数,甚至在 返回 DeregisterIdleRoutine 之后,也可能调用回调函数。
若要修改回调函数的部分或全部特征,客户端和服务提供程序调用 ChangeIdleRoutine 函数。 ChangeIdleRoutine 根据标志参数 ircIdle 的设置方式进行更改; ChangeIdleRoutine 可以更改函数本身、其优先级、时间设置和输入参数。
当操作系统具有定义时,MAPI 定义空闲与操作系统相同。 在 Win32 上,MAPI 创建具有空闲类优先级的线程来计划空闲任务。 此线程会跟踪时间,并将消息发布到线程,该线程在执行任务的时间到达时将执行空闲任务。 Win32 计划线程,而不是进程。 如果工作站上发生优先级高于空闲优先级的任务,则在任务完成之前,不应计划执行空闲任务。
所有空闲任务在调用 MAPIInitIdle 的线程上运行。 MAPI 有一个单独的线程用于计划,但当空闲任务符合条件时,它会将消息发回初始化线程,并在那里执行空闲任务。 对不同类型的客户端的影响如下。
线程模型 | 意义 |
---|---|
单线程 |
没问题。 空闲函数在客户端的main线程上执行,并通过消息循环进行序列化。 |
自由线程 |
空闲函数必须是线程安全的,但客户端已具有必要的基础结构。 客户端可能根本不需要 MAPI 空闲引擎。 |
单元线程 |
如果空闲函数想要使用 MAPI、OLE 或任何其他 COM 接口,必须在注册它的同一线程上执行。 最简单的方法是将空闲函数注册到 MAPI,该函数将消息发布到正确的线程,并直接从该线程的消息循环调度“实际”空闲函数。 |