Me he encontrado con una situación bastante incómoda en un proyecto en el trabajo. Necesitamos crear usuarios en 4 o 5 servicios diferentes, y lo hemos configurado de tal manera que si uno falla, todos fallan. Están encapsulados dentro de un bloque de alcance de transacción.Sincronización de una llamada asincrónica en C#
Uno de los servicios que necesitamos para agregar usuarios requiere el uso de telnet y algunos datos. Hay otras maneras de hacerlo (que cuestan dinero), pero por ahora eso es lo que tenemos que hacer. Agregar un usuario lleva aproximadamente 3 minutos. Vamos a trabajar para reducirlo significativamente como se puede imaginar, pero ese no es realmente el punto. Esta llamada es asíncrona y tiene que ser para que funcione correctamente. El punto clave es que solo puede haber un máximo de 10 conexiones al servicio.
Nuestro proyecto se está configurando para crear usuarios en un lote. Así que potencialmente 50 usuarios crearon a la vez. Esto presenta un problema cuando solo se pueden hacer 10 conexiones a través de telnet, y no es probable que un usuario procesado tarde mucho más que el servicio telnet. Ahora necesito sincronizar este proceso para que el resto no pueda continuar hasta que haya terminado.
Estamos utilizando devoluciones de llamada y delegados con llamadas asíncronas para implementar la funcionalidad. ¿Cuál sería la mejor manera de encapsular la parte asíncrona y no continuar hasta que se complete?
¿Deberíamos configurar un bucle que solo finaliza cuando finaliza la llamada? ¿Hay algo en la biblioteca de Threading que pueda ayudar? Nunca he trabajado con hilos antes, así que esta será la primera vez para mí. ¿Qué herramientas hay para ayudar con este problema?
EDIT:
Si utilizo el/EndInvoke patrón BeginInvoke, se Asynch llamadas dentro del primer delegado honor a la/final comenzará también?
Ejemplo:
public void dele1(string message) {
Console.Write(message);
delegate2 del2 = new delegate2;
del2();
Console.Write("End of Delegate 2");
}
public void dele2() {
// Long Processing
Console.Write("Delegate 2");
}
public delegate void delegate1(String message);
public delegate void delegate2();
delegate1 del1 = new delegate1(dele1);
del1("Delegate 1").BeginInvoke;
del1().EndInvoke;
Console.Write("End of Delegate 1");
// Resultados esperados (Fin de invocación espera hasta que haya terminado Delegado 2):
Delegate 1
End of Delegate 2
Delegate 2
End of Delegate 1
// O (Fin de invocación sólo espera a delegado del 1 al terminar, pero no cualquier llamada de delegado interna):
Delegate 1
End of Delegate 2
End of Delegate 1
Delegate 2
Finalizará la espera de invocación hasta que el segundo delegado finalice el proceso als o? ¿O tendré que usar los patrones de invocación en todas las llamadas delegadas?
No estoy seguro de su sintaxis para su ejemplo editado. ¿Puedes aclarar más qué está sucediendo con del1? – strager