await для IObservable<T>
От: ionoy Эстония www.ammyui.com
Дата: 16.02.15 12:50
Оценка:
Для 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 работать менее удобно, так как нет такого же сахара. А хочется
www.livexaml.com
www.ammyui.com
www.nemerleweb.com
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.