La única forma de tener dos clientes WCF diferentes, es decir, proxies, hacer referencia a la misma instancia de su servicio WCF es usar InstanceContextMode=InstanceContextMode.Single
. Esta es una mala elección si la escala es un problema, por lo que desea utilizar PerCall
si puede.
Cuando se utiliza PerCall
, cada LLAMADA al servicio WCF tiene su propia instancia de servicio WCF. No se comparte la instancia de servicio, pero eso no significa que no compartan el mismo almacenamiento de fondo (por ejemplo, base de datos, memoria, archivo, etc.). Solo recuerda, PerCall
permite que cada llame al para acceder a tu servicio WCF simultáneamente.
La configuración ConcurrencyMode
controla el modelo de subprocesamiento del servicio en sí. Una configuración de Single
restringe todas las instancias del servicio WCF para ejecutarse en el mismo subproceso. Por lo tanto, si tiene varios clientes conectados al mismo tiempo, solo se ejecutarán uno a la vez en el lado del servicio WCF. En este caso, aprovecha el WCF para proporcionar sincronización. Funcionará bien, como ha visto, pero piense que esto solo tiene control de nivel macro sobre la sincronización: cada llamada al servicio WCF se ejecutará en su totalidad antes de que se pueda ejecutar la próxima llamada.
Sin embargo, la configuración ConcurrencyMode
a , permitirá que todas las instancias de servicio WCF se ejecuten simultáneamente. En este caso, , usted es responsable de proporcionar la sincronización necesaria. Piense en esto como que tiene un control de micro nivel sobre la sincronización, ya que puede sincronizar solo aquellas partes de cada llamada que necesitan sincronizarse.
espero que he explicado esta bastante bien, pero aquí es un fragmento de la documentación de MSDN para ConcurrencyMode
por si acaso:
Ajuste ConcurrencyMode a Single instruye al sistema para restringir instancias del servicio a uno el hilo de la ejecución a la vez, que libera de ocuparse de threading issues. Un valor de Múltiple significa que los objetos de servicio se pueden ejecutar por múltiples hilos en cualquier momento. En este caso, debe garantizar la seguridad del hilo .
EDITAR
Se preguntó
¿Hay alguna aumento de rendimiento y, a continuación, utilizando PerCall vs. individual al utilizar ConcurrencyMode.Single? ¿O es el inverso verdadero?
Esto probablemente dependerá del servicio.
Con InstanceContextMode.PerCall
, se crea una nueva instancia de servicio para todas y cada una de las llamadas a través del proxy, por lo que tiene que encargarse de la creación de instancias. Suponiendo que su constructor de servicio no hace mucho, esto no será un problema.
Con InstanceContextMode.Single
, solo existe una instancia de servicio durante la vida útil de la aplicación, por lo que prácticamente no hay gastos generales asociados con la creación de la instancia. Sin embargo, este modo permite que solo una instancia de servicio procese cada llamada que se realice. Por lo tanto, si tiene varias llamadas simultáneas, cada llamada tendrá que esperar a que finalicen las otras para poder ejecutarla.
Por lo que vale, así es como he hecho esto. Use el contexto de instancia PerCall
con concurrencia Multiple
. Dentro de la clase de servicio WCF, cree miembros estáticos para administrar el almacén de datos de fondo y luego sincronice el acceso a estos miembros estáticos según sea necesario usando la instrucción lock
, volatile
campos, etc. Esto permite que su servicio se amplíe bien mientras se mantiene hilo de seguridad.
Definitivamente has clavado mi otra desconexión. Así que usar 'ConcurrencyMode.Multiple', independientemente de InstanceContextMode, significa que estás usando sentencias' lock' alrededor de secciones críticas y realizando otras comprobaciones de seguridad/sincronización de hilos. ¿Hay algún aumento de rendimiento, entonces, usando 'PerCall' contra' Single' cuando se usa 'ConcurrencyMode.Single'? ¿O es el inverso verdadero? –
http://msdn.microsoft.com/en-us/library/ms731193.aspx –
Esta es toda la información excelente. Gracias por ser tan completo; Saqué un montón de eso. –