2010-06-04 69 views
0

对此,可能有一个非常简单的答案,但我的大脑无法正常工作。如何将需要OnError和OnCompleted的方法转换为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新的线程。但它仍然陷入僵局,我是否在正确的轨道上?

回答

1

你在正确的轨道上,有一个小的调整:

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

正如一个评论,使用RX从异步使同步的东西是有点“违背了粮食”。通常,RX用于使异步异步或使异步更容易。

+0

Thx。通过从异步源同步获取结果,Rx使我更容易异步...这是用来实现同步合同,所以我的选择在这里是有限的。 – 2010-06-06 02:39:56