Как превратить синхронную функцию <T>в IObservable <T> - PullRequest
0 голосов
/ 24 февраля 2012

У меня есть класс (который я не контролирую), который имеет длительную синхронную функцию, которая возвращает T. Я хочу сделать это асинхронным, изменив его на IObservable, который ничего не будет, пока функция выполняется, а затем OnNextT) -> 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 Ответ

1 голос
/ 24 февраля 2012

Это просто - просто используйте .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);
}
...