none
WCF MaxConcurrentCalls RRS feed

  • Pregunta

  • No puedo lograr y no encuentro explicación del porqué no funciona un cambio en el seteo de MaxConcurrentCalls en un WCF , en el que necesito que se procesen en paralelo (múltiple) por lo menos 100 threads.
    Mi simple WCF es:

    INTERFACE

    [ServiceContract]
     public interface IWCFPrueba
     {
      [OperationContract]
      CRespuestaCambios Suscribirse(string GUID);

     }

    IMPLEMENTACION

    [

    ServiceBehavior(InstanceContextMode = InstanceContextMode.Single,ConcurrencyMode=ConcurrencyMode.Multiple)]

     public class WCFPrueba : IWCFPrueba
     {
      public const Int32 MinTimeout = 4;
      private static object Sincronizador = new object();
      private static List<CSuscriptoCN> Suscriptos = new List<CSuscriptoCN>();
      
      private static Int32 _contador ;

      #region Suscripcion
      public CRespuestaCambios Suscribirse(string GUID,)
      {
       var respuesta = new CRespuestaCambios();

       try
       {
        _contador++;
        var suscripto = new CSuscriptoCN
        {
         GUIDPropio = GUID,
        };

        if(!suscripto.HayDatosParaProcesar())
        {
         suscripto.EventoPropio = new AutoResetEvent(false);
         var deltaTiempo = new TimeSpan(0, 0, 10);
         
         // Espera a que se indique que tiene que responder o el timeout.
         suscripto.EventoPropio.WaitOne(deltaTiempo);
         // El evento se marcó o se dio el timeout

         suscripto.EventoPropio.Dispose();
         suscripto.EventoPropio = null;
        }
       
       }

       catch(Exception ex)
       {
        respuesta.RespuestaOK = false;
        respuesta.MensajeError = ex.Message;
       }
       return respuesta;
      }

    El Web.config contiene:
    <system.serviceModel>
        <behaviors>
          <serviceBehaviors>

     <behavior>
              <!-- Para evitar revelar información de los metadatos, establezca el valor siguiente en false antes de la implementación -->
              <serviceMetadata httpGetEnabled="true"/>
             
              <serviceDebug includeExceptionDetailInFaults="false"/>

     <serviceThrottling maxConcurrentCalls="160"
       maxConcurrentInstances="2147483647" maxConcurrentSessions="10" />


     </behavior>
          </serviceBehaviors>
        </behaviors>
        <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
      </system.serviceModel>

    Cuando invoco el WCF le envío 50 llamados a la funcion Suscripcion, la que (teóricamente) debería procesar todos los hilos en paralelo luego de una espera de 10 segundos y devolver la respuesta de cada uno, uno tras otro.
    Lo que ocurre realmente es que procesa las llamadas en grupos de 10, y entre cada grupo hace la espera de los 10 segundos.
    ¿Qué estoy hciendo mal para que no procese en forma múltiple las invocaciones?
    Gracias

    martes, 4 de noviembre de 2014 11:35

Todas las respuestas

  • hola

    cual es el host que utilizas para el servicio ? usas el IIS

    porque quizas sea por la cantidad de pool que el iis permite utilizar al sitio

    tampoco veo bueno que uses variables static en un servicio, estas se comportan como el objeto Application (de asp.net) lo cual puede generar bloqueos en el acceso, deberias usar tecnicas de lockeo para el acceso seguro a estas variables

    locking static variable

    read/write locking a static var in asp.net

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    martes, 4 de noviembre de 2014 13:43
  • Leandro:

    Muchas gracias por la respuesta.

    Estoy utilizando IIS, localmente en esta prueba.

    El máximo de conexiones permitidas está fijado (por defecto creo ya que yo no lo cambié) en 4294967295, que creo que indica infinitas conexiones.

    En cuanto a la variable estática, solo la uso en este caso en el que solamente accedo yo para que me indique en el cliente la cantidad de hilos que va procesando. Lógicamente tengo en cuenta (en los casos reales, cuando los usuarios son varios) el lockeo dado el carácter de instancia single y concurrencia múltiple.

    Zacha

    martes, 4 de noviembre de 2014 14:23
  • >>El máximo de conexiones permitidas está fijado (por defecto creo ya que yo no lo cambié) en 4294967295

    pero eos es para WCF, el tema es cuantas pool de conexiones tiene definido el IIS

    el pool del iis define cuantos thread puede administrar, quizas tu limitante viene por ese lado y no por WCF

    >>En cuanto a la variable estática, solo la uso en este caso en el que solamente accedo yo para que me indique en el cliente la cantidad de hilos

    ok, pero eso no evita el acceso concurrente a la variable desde varios thread

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    martes, 4 de noviembre de 2014 14:32
  • ¿Cómo verifico la cantidad de threads que se pueden administrar y cómo la modifico?

    Gracias

    martes, 4 de noviembre de 2014 21:14