ここでは、特に WCF のインスタンス化とコンカレンシーに関連する選択肢がいくつかあります。
インスタンス化: ここでの選択肢は
- PerCall : クライアント要求ごとに新しい InstanceContext (およびサービス オブジェクト) が作成されます。
- PerSession : 新しいクライアント セッションごとに新しい InstanceContext (およびサービス オブジェクト) が作成され、そのセッションの存続期間中維持されます (これには、セッションをサポートするバインディングが必要です)。
- Single : 単一の InstanceContext (およびサービス オブジェクト) が、アプリケーションの存続期間中のすべてのクライアント要求を処理します。
同時実行:
- Single : 各インスタンス コンテキストは、一度にインスタンス コンテキストでメッセージを処理する最大 1 つのスレッドを持つことができます。同じインスタンス コンテキストを使用したい他のスレッドは、元のスレッドがインスタンス コンテキストを終了するまでブロックする必要があります。
- Multiple : 各サービス インスタンスは、メッセージを同時に処理する複数のスレッドを持つことができます。この同時実行モードを使用するには、サービスの実装がスレッドセーフである必要があります。
- Reentrant : 各サービス インスタンスは一度に 1 つのメッセージを処理しますが、再入可能な操作呼び出しを受け入れます。サービスは、WCF クライアント オブジェクトを介して呼び出す場合にのみ、これらの呼び出しを受け入れます。
最初にインスタンス化を見てみましょう:
呼び出しごと: 基本的に、2 つのクライアントがサービスを呼び出した場合、サービスの 2 つの異なるインスタンスが作成され、呼び出しが完了すると破棄されます。
Per Session : これら 2 つのクライアントがプロキシ経由でそれぞれ 2 つの呼び出しを行う場合、これらの呼び出しの両方に対してホストで作成される wcf インスタンスは同じになります (各プロキシに対して、2 つのインスタンスがそれぞれ 2 つを提供しますが、各呼び出し元は同じインスタンスに移動します)。 、その後破棄
Single : 両方のプロキシ/クライアントが同じインスタンスを使用するため、呼び出し元 1 が操作を呼び出し、次に呼び出し元 2 が呼び出しを行い、この同じインスタンスが再利用されます。
かなり簡単です。
並行性に関する限り、上記のインスタンス コンテキストで一度にアクティブなスレッドの数です。ここで、「複数のスレッドを安全に使用するコードを理解して開発することは、書くのが難しい場合がある」と述べている経験と MSDN を支持します (ただし、不可能ではありません) 。
したがって、要件に基づいて、状態を維持したくないようであり、スケーラビリティが懸念される可能性があります。これは、複数のプロキシ呼び出しにサービスを提供しており、シングル インスタンス モードを必要とするあらゆる種類のグローバル データを共有する必要がないためです。考えられる解決策は次のとおりです。
[ServiceBehavior
(ConcurrencyMode.Single,
InstanceContextMode=InstanceContextMode.PerCall)]
public class YourService: IYourService
{
}