2012-02-24 2 views
0

T를 반환하는 장기 실행 동기 함수가있는 클래스가 있습니다.이 클래스를 IObservable로 변경하여 비동기로 만들고 싶습니다. 함수가 실행 중일 때는 아무것도 표시되지 않고 OnNext (T) -> OnCompleted()가됩니다. 이것을 구현하는 가장 간단한 방법은 무엇입니까?<T>을 IObservable로 변환하는 방법 <T>

class Foo 
{ 
    bool TakesAWhile(); 
} 

class FooWrapper 
{ 
    Foo foo; 
    IObservable<bool> TakesAWhile() 
    { 
    // What goes here? 
    } 
} 

다음 작품은 좋지만 뭔가 이상하게 생각됩니다.

public IObservable<bool> TakesAWhile() 
    { 
    var s = new Subject<bool>(); 
    var worker = new BackgroundWorker(); 
    worker.DoWork += (sender, e) => 
     { 
      s.OnNext(foo.TakesAWhile()); 
      s.OnCompleted(); 
     }; 
    worker.RunWorkerAsync(); 
    return s.AsObservable<bool>(); 
} 

답변

1

그것은 간단하다 - 단지 .Start()를 사용합니다. 이 같은

시도 뭔가 :

Func<int> fn =() => 42; 
IObservable<int> ofn = Observable.Start<int>(fn); 
ofn.Subscribe(n => 
{ 
    Console.WriteLine(n); 
}); 

코드에서이 찾고 :

IObservable<bool> TakesAWhile() 
{ 
    return Observable.Start<bool>(foo.TakesAWhile); 
} 
+0

완벽하지만 시작에 스케줄러를 추가 할 수 있습니다. –

관련 문제