共用方式為


內容控制碼的混合模式序列化

從 Windows XP 開始,單一介面可以容納序列化和非序列化的內容控制碼,讓介面上的一個方法可以獨佔存取序列化 (序列化) ,而其他方法則會在共用模式中存取該內容控制碼, (非序列化) 。 如需內容控制碼的詳細資訊,請參閱下列屬性:

序列化和共用模式存取功能相當於讀取/寫入鎖定機制;使用序列化內容控制碼的方法是 (寫入器) 的獨佔使用者,而使用非序列化內容控制碼的方法則共用使用者 (讀取者) 。 終結或修改內容控制碼狀態的方法必須序列化。 未修改內容控制碼狀態的方法,例如只從內容控制碼讀取的方法,可以進行非序列化。 在混合模式中使用內容控制碼可以大幅改善伺服器的延展性,特別是當多個執行緒同時呼叫相同的內容控制碼時。

RPC 不會在共用模式中使用內容控制碼對方法強制執行「寫入鎖定」,這表示應用程式必須確保不會修改共用模式內容控制碼。 修改共用模式中使用的內容控制碼可能會導致內容控制碼內容的細微損毀,而無法進行偵錯。

變更內容控制碼的序列化邏輯只會影響伺服器。 此外,變更內容控制碼的序列化邏輯不會影響連線格式,因此對伺服器上的序列化邏輯所做的變更不會影響現有用戶端與伺服器互動的功能。

不建議只使用非序列化內容控制碼。 使用非序列化控制碼的伺服器應該切換為關閉內容控制碼之方法的序列化存取。

只有 [out] 的內容控制碼通常由建立方法使用,而且不需要任何序列化。 因此,RPC 會忽略套用至僅限 [out] 內容控制碼的任何序列化屬性,例如 coNtext_handle_serializecoNtext_handle_noserialize

注意

建立方法會隱含序列化。

 

範例

下列兩個範例示範如何啟用內容控制碼的混合模式序列化。

第一個範例示範如何在 IDL 檔案中執行此動作:

typedef [context_handle] void *TestContextHandleExclusive;
typedef [context_handle] TestContextHandleExclusive TestContextHandleShared;

void
UseShared(...
          [in] TestContextHandleShared *Ctx,
          ...);

void
UseExclusive(...
             [in, out] TestContextHandleExclusive *Ctx,
             ...);

第二個範例示範如何在 ACF 檔案中啟用內容控制碼的混合模式序列化:

typedef [context_handle_serialize] TestContextHandleExclusive;

typedef [context_handle_noserialize] TestContextHandleShared;

coNtext_handle

coNtext_handle_serialize

coNtext_handle_noserialize