Каковы некоторые из альтернатив асинхронному шаблону на основе событий? - PullRequest
5 голосов
/ 07 декабря 2011

Я смотрю на реализацию API, где несколько операций могут выполняться одновременно.Основанная на событиях асинхронная модель была рекомендована MS:

// Asynchronous methods.
public void Method1Async(string param, object userState);
public event Method1CompletedEventHandler Method1Completed;

public void CancelAsync(object userState);
public bool IsBusy { get; }

Однако это кажется немного неуклюжим - требуется, чтобы клиенты отфильтровывали ответы, которые им не предназначались, и отключали обработчик событий, когда это сделано.и т. д. Я думаю, что-то вроде:

AsyncOperation1(string parm, Action<T> callback)

Каждый клиент получает свои собственные результаты, полученные напрямую.У меня возникли проблемы с поиском элегантной поддержки отмены.Я предполагаю, что очевидным является то, что AsyncOperation1 возвращает некоторый токен, который может быть передан в метод CancelAsync.Я хотел бы узнать больше о том, какие другие асинхронные шаблоны широко используются в .Net или на других языках, которые могут быть переведены соответствующим образом

1 Ответ

4 голосов
/ 07 декабря 2011

Взгляните на Reactive Extensions , вы можете вернуть Observable, на который могут подписаться клиенты.

Подписка возвращает объект, реализующий IDisposable, который является механизмом отменыподписку, просто избавьтесь от объекта.

Например:

IObservable<T> o = Method1Async(params);

var observer = o.Subscribe(r => {/*do stuff with the result*/},
                           ex => {/* do stuff with the exception */);

// decide to cancel
observer.Dispose();

Вы можете установить биты Reactive Extensions, используя nuget, просто «install-package rx-main»

...