Я был на разрыве в последнее время, пытаясь узнать все, что я могу о .Net многопоточности. (Улучшайтесь, но все равно чувствуйте, что есть много, чтобы учиться). Сейчас я сосредоточен на APM (Asynchronous Programming Model), который широко известен как это:Является ли это хорошим способом реализации модели асинхронного программирования?
//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)
{
}
Теперь, скажем, я пишу какую-то библиотеку, и я хочу, чтобы разоблачить эту функциональность для любого, кто потребляющих мой API, я думал о способах реализации этого шаблона. Реализация интерфейса IAsyncResult - это возможность, но она кажется довольно сложной. Мой вопрос заключается в том, что использование делегата является приемлемым решением. Что я имею в виду, что это:
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);
}
}
В принципе, каждый делегат имеет функциональность BeginXXX и EndXXX запеченную прямо в него. Можно ли воспользоваться этим и просто разоблачить IAsyncResult, или что-то не так с этим, о чем я не думаю.
Это был всего лишь пример. Игнорируйте фактическую реализацию (которая, по общему признанию, выглядит глупо и бессмысленно), я прошу об использовании делегата, и это IAsyncResult. – BFree
Поскольку предоставляется синхронная и асинхронная версия, клиент по-прежнему принимает такое решение. OP больше обеспокоен тем, является ли выбранный метод хорошим способом реализации APM или нет. – Crippledsmurf
@BFree, теперь я. – Benny