Si estas usando threads foregorund y tienes un WaitAny con timeout, quizás tu aplicación no se comporte como esperas …

El otro día estábamos trabajando sobre un servicio web de hub que recoge peticiones de un cliente crea varios mensajes para diferentes proveedores, se las envía junta las respuestas y se las devuelve al Cliente como una.

Teníamos el problema de que si algún proveedor estaba lento, que siempre hay alguno, ralentizaba todo el proceso, así que le pusimos un timeot al WaitAny para que, pasados un tiempo, dejara de esperar respuestas y continuara con el proceso, algo así:

for (int i = 0; i < Services.Count; i++)
{                
	XmlDocument DocOut = new XmlDocument();
	DocOut.LoadXml(rq.ToString());
	Services[i].myMethodAsync(DocOut);
}
 
WaitHandle.WaitAny(new[] { ev }, timeout);

Aunque el timeout estaba funcionando, ya que el servicio no incluía en la respuesta los que habían tardado mas que el timeout, el servicio no devolvía respuesta hasta que todos los servicios habían contestado …

Eso es debido a que los threads eran del tipo foreground y no dará por terminado el proceso hasta que todos terminen …

La solución, abortar los threads a mano después del timeout:

for (int i = 0; i < Services.Count; i++)
{                
	XmlDocument DocOut = new XmlDocument();
	DocOut.LoadXml(rq.ToString());
	Services[i].myMethodAsync(DocOut);
}
 
WaitHandle.WaitAny(new[] { ev }, timeout);
 
foreach (var service in Services)
{
	service.Abort();
}

De esta manera el proceso termina cuando tu quieres.

Categories: , , ,

Leave a Reply


*

PUBLICIDAD

EMAIL





posts recientes

MapReduce con MongoDB

Posted on may - 18 - 2012

0 Comment

Habilitar la compresión de...

Posted on abr - 25 - 2012

0 Comment

Bamboo, MSBuild y referencias...

Posted on abr - 17 - 2012

2 Comments

Sponsors

  • Etooltech
  • Dingus Services
  • Etooltech
  • Dingus Services