Для Task'ов есть удобный сахар в виде async/await. IObservable<T> — это фактически тот же Task, но для множества значений.
Так почему бы не добавить await для IObservable, раз уж он есть для тасков?
Что-то наподобие этого:
IObservable<string> strings = GetStringsObservable();
await foreach(var str in strings) {
// Здесь у нас OnNext обработчик
} catch (Exception e) {
// OnError
}
//Всё что после "цикла" - это OnCompleted
Как и в случае с IEnumerable<T>, мы можем комбинировать и модифицировать источник:
await foreach(var str in strings.Where(s => !string.IsNullOrWhitespace(s)) {
Debug.WriteLine(str);
}
Проблемы контекста не стоит, так как эта функциональность уже встроена в RX:
await foreach(var str in strings.ObserveOn(RxMain.MainThreadScheduler)) {
}
В добавок было бы круто иметь yield для генерации IObservable:
IObservable<int> GetNumbers()
{
yield 0;
yield 1;
yield 2;
}
==>
IObservable<int> GetNumbers()
{
return Observable.Create(obs => {
obs.OnNext(0);
obs.OnNext(1);
obs.OnNext(2);
});
}
На практике, я примерно одинаково много пользуюсь как тасками, так и IObservable<T>. В последнее время появилось ощущение, что с IObservable работать менее удобно, так как нет такого же сахара. А хочется