Estoy escribiendo una aplicación en red.Uso de la Biblioteca de tareas paralelas en un patrón asíncrono basado en eventos
Los mensajes se envían a través del transporte como tal:
Network.SendMessage (new FirstMessage());
me puedo registrar un controlador de eventos que se llamará cuando este tipo de mensaje llega, así:
Network.RegisterMessageHandler<FirstMessage> (OnFirstMessageReceived);
Y el evento se activa :
public void OnFirstMessageReceived(EventArgs<FirstMessageEventArgs> e)
{
}
estoy escribiendo un procedimiento de autenticación personalizado para mi aplicación en red, que requiere alrededor de cinco mensajes para completar.
sin utilizar las bibliotecas de tareas en paralelo, que se verían obligados a codificar el siguiente paso de cada procedimiento en el controlador de eventos anterior, así:
public void OnFirstMessageReceived(EventArgs<FirstMessageEventArgs> e)
{
Network.SendMessage(new SecondMessage());
}
public void OnSecondMessageReceived(EventArgs<SecondMessageEventArgs> e)
{
Network.SendMessage(new ThirdMessage());
}
public void OnThirdMessageReceived(EventArgs<ThirdMessageEventArgs> e)
{
Network.SendMessage(new FourthMessage());
}
public void OnFourthMessageReceived(EventArgs<FourthMessageEventArgs> e)
{
// Authentication is complete
}
no me gusta la idea de saltar alrededor de la código fuente para codificar una parte de esto y una parte de eso. Es difícil de entender y editar.
He oído que la Biblioteca de tareas paralelas simplifica sustancialmente esta solución.
Sin embargo, muchos de los ejemplos que leí utilizando la Biblioteca de tareas paralelas estaban relacionados con el inicio de una cadena de tareas activas. Lo que quiero decir con 'activa', es que cada tarea podría comenzar cuando se le llama de forma explícita, así:
public void Drink() {}
public void Eat() {}
public void Sleep() {}
Task.Factory.StartNew( () => Drink())
.ContinueWith(() => Eat() )
.ContinueWith(() => Sleep());
Esto es lo contrario de mi patrón asincrónico basado en eventos, en los que cada método de control de eventos sólo se llama cuando el mensaje es recibido
En otras palabras, no se puede hacer algo como esto (pero quiero):
Task.Factory.StartNew( () => OnFirstMessageReceived() )
.ContinueWith(() => OnSecondMessageReceived())
.ContinueWith(() => OnThirdMessageReceived() )
.ContinueWith(() => OnFourthMessageReceived());
He leído this article, pero no acabo de entenderlo. Parece que lo que necesito tiene que ver con TaskCompletionSource
. Si quisiera realizar una tarea desde mi patrón asíncrono basado en eventos, como el bloque de código anterior, ¿cómo se vería?
Este es un gran consejo, y realmente me permitió trabajar con WebClient mucho más fácil. ¡¡Gracias!! –