Преимущества использования стандартных шаблонов .Net Async? - PullRequest
5 голосов
/ 23 ноября 2011

Я разрабатываю класс, который выполняет долгосрочные задачи. Первый дизайн, который я придумал, был:

public TaskHandle DoSomethingAsync(DoSomethingCompleteCallback completedCallback);
public void       CancelDoSomething(TaskHandle handle);

Это просто и кратко. Однако мне интересно, должен ли я реализовать его как один из стандартных асинхронных шаблонов .Net, о которых я читал?

APM:

public IAsyncResult BeginDoSomething(AsyncCallback completedCallback, Object stateObject);
public void         EndDoSomething(IAsyncResult asyncResult);

EAP:

public void  DoSomethingAsync(string param, object userState);
public event DoSomethingCompletedEventHandler DoSomethingCompleted;

Похоже, что они усложняют интерфейс, не принося никаких реальных преимуществ, кроме того, что шаблоны распознаются другими разработчиками .Net. APM требует, чтобы клиентский код всегда вызывал EndDoSomething () даже в их завершенном вызове, а EAP требуется отдельная подписка на завершенное событие.

Каковы преимущества, если таковые имеются, использования стандартных шаблонов, которые мне не хватает?

1 Ответ

8 голосов
/ 23 ноября 2011

Единственным преимуществом этих шаблонов является то, что они мгновенно распознаются другими разработчиками и могут иметь поддержку инфраструктуры (например, поддержка начала и конца в WCF).

Однако с введением TPL и .Net4 и далееПохоже, что интеграция в новый выпуск .Net4.5 .Net отходит от парадигм IAsyncResult / Begin End и больше к асинхронности, основанной на задачах (предпочтительно IMHO).

Итак, чтобы перейти к новому пути:

public Task DoSomethingAsync(string param);

И тогда все операции, относящиеся к отмене / доступу к результатам, доступны для объекта Task, что позволяет правильно абстрагировать асинхронный механизм, поскольку все потребители полагаются только на Task, а не на 'initiator'работы И дескриптор, который возвращается.

...