Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to convert an IEnumerable<Task<T>> to IObservable<T>

Is there a built in way to convert an IEnumerable<Task<T>> to an IObservable<T>. Order doesn't matter, just that I get things, though preferably as they're completed.

If it doesn't exist yet, what might be a good way to accomplish it?

like image 980
The Grand User Avatar asked Nov 21 '12 19:11

The Grand User


3 Answers

I believe this will work

tasks.Select(t => Observable.FromAsync(() => t))
     .Merge();

Each task will send its results to the observable sequence in whatever order they complete. You can subscribe to the sequence and do whatever you want with the results that way.

like image 89
Bryan Anderson Avatar answered Nov 08 '22 20:11

Bryan Anderson


You could do it this way:

var query = tasks.ToObservable().SelectMany(task => task.ToObservable());

Or, alternatively, like this:

var query =
    from t in tasks.ToObservable()
    from i in t.ToObservable()
    select i;
like image 31
Enigmativity Avatar answered Nov 08 '22 20:11

Enigmativity


I believe what you're looking for may be Observable.Start()

You can then append .Subscribe(callbackMethod) to the end and specify a callback if needed.

like image 1
Khan Avatar answered Nov 08 '22 21:11

Khan