Estoy implementando un servicio asíncrono. Después de evaluar el example de Microsoft, me pregunto si su enfoque es realmente asincrónico. Estoy bastante seguro de que es así, pero algunas de las muestras que he visto en línea y el parámetro AsyncCallback
hacen que me pregunte.Servicio WCF verdaderamente asíncrono
De acuerdo con el ejemplo, tenemos que poner en práctica el Begin y Fin par método como este:
public IAsyncResult BeginGetAcmeAnvil(AsyncCallback callback, object state)
{
// Starts synchronous task
var acmeAsyncResult = new AcmeAsyncResult<Anvil>
{
Data = new Anvil()
};
return acmeAsyncResult;
}
public Anvil EndGetAcmeAnvil(IAsyncResult result)
{
var acmeAsyncResult = result as AcmeAsyncResult<Anvil>;
return acmeAsyncResult != null
? acmeAsyncResult.Data
: new Anvil();
}
Bastante sencillo, pero ¿por qué tenemos un parámetro AsyncCallback
? ¿No deberíamos hacer una llamada al callback
que activará el método End?
Esto es lo que tengo en mente:
public delegate void AsyncMethodCaller(AcmeAsyncResult<Anvil> acmeAsyncResult,
AsyncCallback callback);
public IAsyncResult BeginGetAcmeAnvil(AsyncCallback callback, object state)
{
var acmeAsyncResult = new AcmeAsyncResult<Anvil>();
var asyncMethodCaller = new AsyncMethodCaller(GetAnvilAsync);
// Starts asynchronous task
asyncMethodCaller.BeginInvoke(acmeAsyncResult, callback, null, null);
return acmeAsyncResult;
}
private void GetAcmeAnvilAsync(AcmeAsyncResult<Anvil> acmeAsyncResult,
AsyncCallback callback)
{
acmeAsyncResult.Data = new Anvil();
callback(acmeAsyncResult); // Triggers EndGetAcmeAnvil
}
public Anvil EndGetAcmeAnvil(IAsyncResult result)
{
var acmeAsyncResult = result as AcmeAsyncResult<Anvil>;
return acmeAsyncResult != null
? acmeAsyncResult.Data
: new Anvil();
}
Hice algunas pruebas de carga usando loadUI, pero no hubo cambios en el rendimiento obvias.