共用方式為


MAPI 中的線程處理

適用於:Outlook 2013 |Outlook 2016

線程是操作系統配置 CPU 時間的基本實體。 線程有自己的緩存器、堆疊、優先順序和記憶體,但共用位址空間和處理資源,例如存取令牌。 線程也會共用記憶體,其中一個線程會讀取另一個線程所寫入的內容。

MAPI 用戶端會使用下列泛型線程模型。

線程模型 描述
單個線程模型
所有物件都會用於單一線程。
Apartment 線程模型
物件只能用於建立對象的線程上。
可用線程或線程合作物件模型
物件可以用於任何線程。

MAPI 使用可用的線程模型,支援可隨時在任何線程上使用的安全線程物件。 OLE 會使用 Apartment 線程模型。 Apartment 線程模型支持當建立對象的線程以外的線程需要使用該物件時,必須明確傳輸的物件。

OLE 用來將物件從一個線程傳送到另一個線程的機制稱為封送處理。 封送處理涉及存根物件和 Proxy 物件。 這些特殊物件會封裝物件中要封送處理之介面的參數、將這些參數傳送至另一個線程,並在抵達時將其解除封裝。 當使用 OLE「輕量型」 遠端過程調用或 LRPC 將自由線程 MAPI 物件傳送至另一個進程時,就會發生兩個多線程模型之間的衝突。 LRPC 會將對象的語意從可用線程變更為 Apartment 線程,方法是將存根和 Proxy 介面與物件與其呼叫端之間的 Apartment 線程行為交集。 瞭解MAPI中導致此衝突的情況,可協助客戶端和服務提供者防止發生問題。

可以存取 MAPI 物件:

  • 透過使用服務提供者所傳回的介面指標或連結至客戶端進程的MAPI,例如 從MAPILogonEx傳回的會話物件,直接呼叫其方法。

  • 透過使用任何服務提供者所傳回之介面指針對其方法的間接呼叫,例如從 IMAPIFolder::CopyFolder 中另一個資料夾複製的資料夾物件。

  • 透過回呼函式,例如傳遞至服務提供者 的 IMAPIAdviseSink::OnNotify 方法,或在 建議呼叫中 傳遞至 MAPI 的方法,或是可顯示冗長作業進度的方法。