Методы расширения в .net Реактивные расширения для Action <T> - PullRequest
1 голос
/ 04 августа 2011

У меня есть два асинхронных метода, которые принимают обратные вызовы Action.Мне было интересно, есть ли в Rx расширение для действий?

Моя цель - дождаться вызова обоих обратных вызовов и затем выполнить некоторую обработку?

1 Ответ

5 голосов
/ 04 августа 2011

Это из Джесси и моей следующей книги , но вот, пожалуйста, это халява:

public Func<T1, IObservable<TRet>> FromCallbackPattern<T1, TRet>(Action<T1, Action<TRet>> originalMethod)
{
    return new Func<T1, IObservable<TRet>>((param1) => {
        var subject = new AsyncSubject<TRet>();

        try {
            return originalMethod(param1, (result) => {
                subject.OnNext(result);
                subject.OnCompleted();
            });
        } catch (Exception ex) {
            subject.OnError(ex);
        }

        return subject;
    });
}

Вот как вы ее используете:

// Here's a sample method that follows the callback pattern
public void DownloadPageTextAsync(string url, Action<string> callback);

var dlPageRx = FromCallbackPattern(DownloadPageTextAsync);

dlPageRx("http://www.jesseliberty.com")
    .Subscribe(pageText => Console.WriteLine(pageText));
...