He estado llorando últimamente tratando de aprender todo lo que pueda sobre .Net Multithreading. (Mejorando, pero aún siento que hay mucho que aprender). En este momento estoy centrado en el APM (Asynchronous modelo de programación) que se conoce comúnmente como esto:¿Es esta una buena manera de implementar el Modelo de programación asincrónica?
//non async method
public int DoSomeWork(int arg)
{
//do something and return result
}
//async version
public IAsyncResult BeginDoSomeWork(int arg, AsyncCallback callback, object @object)
{
}
public int EndDoSomeWork(IAsyncResult result)
{
}
Ahora, digamos que estoy escribiendo alguna biblioteca, y quiero exponer esta funcionalidad para cualquier persona que consume mi API, estaba pensando en formas de implementar este patrón. Implementar la interfaz IAsyncResult es una posibilidad, pero parece bastante complejo. Mi pregunta es si el uso de delegado es una solución aceptable. Lo que quiero decir con esto es la siguiente:
public class MyClass
{
private Func<int, int> func;
//non async method
public int DoSomeWork(int arg)
{
//do something and return result
}
//async version
public IAsyncResult BeginDoSomeWork(int arg, AsyncCallback callback, object @object)
{
this.func = new Func<int, int>(DoSomeWork);
var asyncResult = this.func.BeginInvoke(arg,callback,object);
return asyncResult;
}
public int EndDoSomeWork(IAsyncResult result)
{
return this.func.EndInvoke(result);
}
}
Básicamente, cada delegado tiene la funcionalidad BeginXxx y EndXxx al horno la derecha en ella. ¿Está bien aprovechar eso y solo exponer IAsyncResult, o hay algo mal con esto en el que no estoy pensando?
Fue solo un ejemplo. Ignore la implementación real (que ciertamente parece estúpida e inútil), estoy preguntando sobre el uso del delegado y es IAsyncResult. – BFree
Como se proporciona una versión síncrona y asíncrona, el cliente aún puede tomar esa decisión. El OP está más preocupado acerca de si el método elegido es una buena forma de implementar APM o no. – Crippledsmurf
@BFree, ahora mismo. – Benny