存留期管理
增益集模型的遠端功能會讓存留期管理更為複雜。 由於記憶體回收未適當地支援回收多個應用程式定義域中的物件,因此增益集模型會提供自己的存留期管理系統。 這套管理系統會使用參考計數系統及 Common Language Runtime 的遠端服務。
增益集模型的存留期管理系統可跨越多個應用程式定義域和各自獨立的處理序,以確實處置物件、合約和增益集,以及卸載其應用程式定義域。 系統是藉由在增益集提供服務給來自主機的呼叫時,維護增益集的語彙基元控制代碼 (ContractHandle) 的方式達成這個目的。
存留期管理實作
若要實作存留期管理,您必須在合約至檢視 (Contract-to-view) 配接器中使用合約時取得存留期語彙基元,然後在配接器完成處理時撤銷存留期語彙基元。 如果您在配接器中使用合約,則 ContractHandle 類別會自動執行這項工作。 如果您的管線傳遞自訂型別,那麼您必須取得實作的所有合約至檢視配接器類別中的語彙基元控制代碼。 如需合約至檢視配接器的詳細資訊,請參閱合約、檢視和配接器。
ContractHandle 類別會將合約視為其建構函式。 以下範例將說明如何設定主應用程式端配接器中的存留期語彙基元控制代碼。
重要事項 |
---|
ContractHandle 對於存留期管理來說非常重要。如果您無法保留 ContractHandle 物件的參考,記憶體回收將會回收該物件,而且若程式不接受管線,管線將隨即關閉。這可能會造成難以診斷的錯誤,例如 AppDomainUnloadedException。關機是管線週期的正常階段,因此存留期管理程式碼無法將這種狀況偵測為錯誤。 |
Private _contract As ICalc2Contract
Private _handle As ContractHandle
Public Sub New(ByVal contract As ICalc2Contract)
_contract = contract
_handle = New ContractHandle(contract)
End Sub
private CalculatorContracts.ICalc2Contract _contract;
private System.AddIn.Pipeline.ContractHandle _handle;
public CalculatorContractToViewHostAdapter(ICalc2Contract contract) {
_contract = contract;
_handle = new System.AddIn.Pipeline.ContractHandle(contract);
}
一旦取得語彙基元控制代碼,系統就會處理所有存留期管理功能,而不需要額外的程式設計。
在增益集模型下,主應用程式和增益集的運作方式就像是本身的存留期管理是由記憶體回收行程所控制。 其本機參考會經過處置,而導致所有遠端參考也都經過處置及回收。
關閉增益集
主應用程式可藉由呼叫 AddInController 類別的 Shutdown 方法,關閉增益集的應用程式定義域。
AddInController 類別會追蹤增益集及其應用程式定義域,並確實將它們卸載。