Как преобразовать метод, который принимает OnError и OnCompleted, в Observable

Вероятно, на это есть действительно простой ответ, но мой мозг просто не работает.

У меня есть метод, который мне нужно вызвать в фреймворке, который не поддерживает Observable, который имеет следующий шаблон.

client.GetAsync<TResult>(
     string resource, 
     Action<Exception> onError, 
     Action<TResult> onCompleted);

Мне нужно преобразовать это в синхронное действие, ожидающее результата. Я подумал, что Rx поможет мне, поэтому я попытался

var observable = Observable.Create<XElement>(
    observer => () => client.GetAsync<XElement>(
        "resource1",
        observer.OnError,
        observer.OnNext);
var result = observable.First();

Но это здесь, но это просто тупиковые ситуации, я попытался сделать его ObserveOn новым потоком и SubscribeOn новым потоком. Но это все еще тупиковые ситуации, я вообще на правильном пути?


person Flatliner DOA    schedule 04.06.2010    source источник


Ответы (1)


Вы на правильном пути, с небольшой корректировкой.:

var observable = Observable.Create<XElement>( 
    observer => 
    {
        client.GetAsync<XElement>( 
        "resource1", 
        observer.OnError, 
        x => 
        {
           observer.OnNext(x);
           observer.OnCompleted();
        }); 
        return () => {};
    });

Как комментарий, использование RX для создания синхронных вещей из асинхронных как бы «идет вразрез». Обычно RX используется, чтобы сделать асинхронный из синхронного или упростить асинхронный.

person Sergey Aldoukhov    schedule 04.06.2010
comment
Спасибо. Rx упрощает асинхронность для меня... синхронно получая результат из асинхронного источника. Это используется для реализации синхронного контракта, поэтому мой выбор здесь ограничен. - person Flatliner DOA; 06.06.2010