Con la lógica de negocio encapsulada detrás sincrónica llamadas de servicio ej .:Estrategias para llamar servicio síncrono llama de forma asincrónica en C#
interface IFooService
{
Foo GetFooById(int id);
int SaveFoo(Foo foo);
}
¿Cuál es la mejor manera de extender/uso de estas llamadas de servicio en un moda asíncrona?
En la actualidad he creado una clase simple AsyncUtils:
public static class AsyncUtils
{
public static void Execute<T>(Func<T> asyncFunc)
{
Execute(asyncFunc, null, null);
}
public static void Execute<T>(Func<T> asyncFunc, Action<T> successCallback)
{
Execute(asyncFunc, successCallback, null);
}
public static void Execute<T>(Func<T> asyncFunc, Action<T> successCallback, Action<Exception> failureCallback)
{
ThreadPool.UnsafeQueueUserWorkItem(state => ExecuteAndHandleError(asyncFunc, successCallback, failureCallback), null);
}
private static void ExecuteAndHandleError<T>(Func<T> asyncFunc, Action<T> successCallback, Action<Exception> failureCallback)
{
try
{
T result = asyncFunc();
if (successCallback != null)
{
successCallback(result);
}
}
catch (Exception e)
{
if (failureCallback != null)
{
failureCallback(e);
}
}
}
}
que me permite llamar a cualquier cosa de forma asíncrona:
AsyncUtils(
() => _fooService.SaveFoo(foo),
id => HandleFooSavedSuccessfully(id),
ex => HandleFooSaveError(ex));
Mientras que esto funciona en casos de uso sencillos que rápidamente se complica si otros procesos Necesito coordinar sobre los resultados, por ejemplo, si necesito guardar tres objetos de forma asincrónica antes de que el hilo actual pueda continuar, entonces me gustaría una manera de esperar/unir los hilos de trabajo.
Opciones He pensado hasta ahora incluyen:
- tengan AsyncUtils vuelven a WaitHandle
- tengan AsyncUtils utilizan un AsyncMethodCaller y devuelven un IAsyncResult
- reescribir la API para incluir Begin, terminar llamadas asíncronas
por ejemplo algo parecido a:
interface IFooService
{
Foo GetFooById(int id);
IAsyncResult BeginGetFooById(int id);
Foo EndGetFooById(IAsyncResult result);
int SaveFoo(Foo foo);
IAsyncResult BeginSaveFoo(Foo foo);
int EndSaveFoo(IAsyncResult result);
}
¿Hay otros enfoques que debería considerar? ¿Cuáles son los beneficios y las posibles dificultades de cada uno?
Idealmente me gustaría mantener la capa de servicio simple/sincrónica y proporcionar algunos métodos de utilidad fáciles de usar para llamarlos de forma asíncrona. Me interesaría conocer las soluciones e ideas aplicables a C# 3.5 y C# 4 (no hemos actualizado aún pero lo haremos en un futuro relativamente próximo).
Esperamos sus ideas.
¿Por qué no utiliza la Biblioteca de tareas paralelas? Fue hecho para esto. http://msdn.microsoft.com/en-us/library/dd460717.aspx –
Lo que dijo John, pero en específico, prueba 'Lazy'. –
@Steven: debe ser la tarea, para este tipo de operación. Lazy es para inicialización. –