Вы действительно не хотите использовать этот шаблон:
void GetDataAsync(string parameters,
Action<IEnumerable<object>> onSuccess, Action<Exception> onError);
Вместо этого вы хотите использовать это:
Task GetDataAsync(string parameters);
При возврате Task
, вы возвращаете экземпляр, который представляет асинхронную единицу работы.Оттуда потребитель API может выбрать вызов ContinueWith
и решить, что делать, когда он преуспевает, или если есть ошибка.
Однако, есть недостаток дизайнав вашем примере.В методе с именем GetDataAsync
я ожидаю, что данные будут возвращены.Это не проблема, вы можете просто изменить подпись на:
Task<MyData> GetDataAsync(string parameters);
Теперь это возвращает Task<T>
, который вы можете использовать Result
свойство или получить результат (он заблокируется, если задача не выполнена), или вы можете снова использовать метод ContinueWith
для обработки данных после выполнения асинхронной операции.
Кроме того, вы можете взятьCancellationToken
структура экземпляр параметра, чтобы определить, следует ли отменить операцию:
Task<MyData> GetDataAsync(string parameters,
CancellationToken cancellationToken);
Опять же, ContinueWith
позволит вам указать действие, которое нужно предпринять при отмене.
Обратите внимание, что именно таким образом в настоящее время моделируются методы, использующие await
и async
в Async CTP ;они возвращаются Task
или Task<T>
;если вы сделаете то же самое в своем коде, вы будете готовы к тому, что эти функции языка будут включены.