CallContext の使用
呼び出しコンテキストは、実行コード パスによって搬送される一連のプロパティを提供します。CallContext クラスのインスタンスが実行コード パスを通過するときには、このインスタンスにエントリを追加できます。
CallContext オブジェクトは、コンテキスト間やアプリケーション ドメイン間を移動するときに、"__CallContext" エントリ (型は LogicalCallContext) 内の IMessage 実装で渡されます。メッセージ シンクは、__CallContext がメッセージ シンク チェーンを通過するときに、__CallContext にエントリを追加したり、エントリを検索したりできます。
呼び出しコンテキストは、アプリケーション ドメインの境界で複製されます。ILogicalThreadAffinative インターフェイスを公開するオブジェクトは、アプリケーション ドメインの外部に反映され、受信側のスレッドに追加されます。このインターフェイスをサポートしないオブジェクトは、アプリケーション ドメインの外部に反映されません。
CallContext は、呼び出しパスのデータ スロットを提供します。CallContext.SetData および CallContext.GetData を使用して、アプリケーション コードで呼び出しコンテキスト スロットを管理できます。データ スロットは呼び出しパスごとに一意であり、そのため、状態は呼び出しパスを越えては共有されません。スロットは名前付きです。この名前は、データ スロットにアクセスするために使用されます。スロットは、名前を使用して明示的に解放できます。
CallContext を使用したリモート処理の例については、「リモート処理の例 : CallContext」を参照してください。
Async および CallContext
BeginInvoke メソッドは、CallContext をサーバーに渡します。EndInvoke メソッドが呼び出されると、CallContext はスレッドに戻されます。これには、BeginInvoke と EndInvoke が連続して呼び出される場合や、BeginInvoke が 1 つのスレッドで呼び出され、EndInvoke がコールバック関数で呼び出される場合も含まれています。
CallContext のエントリが、現在のスレッドの CallContext と、EndInvoke によって提供された CallContext の両方に共通な場合は、EndInvoke のエントリがスレッドの CallContext のエントリを上書きします。
コンテキスト相対静的フィールド
コンテキスト相対静的フィールドは、コンテキストに対して相対的なフィールドを規定します。特定のコンテキストが静的フィールドにアクセスした場合、値は常にそのコンテキストに相対的で、フィールドは複数のコンテキスト間で共有されません。その静的フィールドが別のコンテキストでアクセスされると、フィールドには別の値が格納されます。
コンテキスト相対静的フィールドを使用するには、ContextBoundObject オブジェクトのフィールドに ContextStaticAttribute 属性を適用します。