Al invocar un servicio WCF asincrónico, parece que hay dos maneras de hacerlo.¿Qué modo se prefiere cuando se realizan llamadas WCF asíncronas?
1.
WcfClient _client = new WcfClient();
public void One()
{
_client.BegindoSearch("input", ResultOne, null);
}
private void ResultOne(IAsyncResult ar)
{
string data = _client.EnddoSearch(ar);
}
2.
public void Two()
{
WcfClient client = new WcfClient();
client.doSearchCompleted += TwoCompleted;
client.doSearchAsync("input");
}
void TwoCompleted(object sender, doSearchCompletedEventArgs e)
{
string data = e.Result;
}
Y con la nueva clase Task<T>
tenemos una tercera forma fácil envolviendo el funcionamiento síncrono en una tarea.
3.
public void Three()
{
WcfClient client = new WcfClient();
var task = Task<string>.Factory.StartNew(() => client.doSearch("input"));
string data = task.Result;
}
Todos ellos le dan la capacidad de ejecutar otro código mientras espera el resultado, pero creo que Task<T>
da un mejor control sobre lo que se ejecuta antes o después de que el resultado se recupera .
¿Hay alguna ventaja o desventaja al usar una sobre la otra? ¿O escenarios donde una forma de hacerlo es más preferible?
El aspecto del subproceso Trabajador vs IO es interesante. Sé que el grupo de subprocesos tiene una cantidad fija de cada uno y que puede cambiarlos. Pero cuál es la diferencia entre un subproceso de trabajo y subproceso de E/S en el marco. Supongo que es más que solo semántica. –
@Mikael: los hilos de E/S están diseñados para largos períodos de espera; básicamente se van a dormir y esperan a que el sistema de E/S los vuelva a activar con una interrupción. Los subprocesos de trabajo están pensados para el trabajo pesado de la CPU, y no desea desperdiciarlos al bloquear las llamadas de E/S sincrónicas. – Aaronaught
hay más información en este artículo de MSDN sobre las tareas con respecto a los subprocesos de trabajo: http://msdn.microsoft.com/en-us/magazine/ff959203.aspx, también un buen fondo (una clase de lección de historia) sobre el diferentes métodos asíncronos disponibles en.NET –