如何将同步函数<t>转换为IObservable <t> </t> </t>

时间:2012-02-24 05:28:55

标签: system.reactive

我有一个类(我无法控制),它有一个长时间运行的同步函数,它返回T.我希望通过将其更改为一个IObservable使其异步,该函数在函数运行时无效,然后OnNext( T) - &gt; OnCompleted()。实现这个的最简单方法是什么?

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 个答案:

答案 0 :(得分: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);
}