От IObservable‹T› к задаче

Так дело вот в чем. Предположим, где-то я заполняю Collection. Каждый раз, когда добавляется элемент, IObservable вызывает OnNext для своих подписчиков.

Теперь будет точка, в которой коллекция будет заполнена. (Что-то читал и дочитал.. что угодно). В этот момент для подписчиков вызывается OnComplete().

Однако пользователь не заметит этот метод. Он скорее вызовет асинхронный метод, которого он будет ждать... ему все равно, что он прочитал, ему просто важно, что он закончил читать.

Итак, в основном, я хочу от IObservable Task, который возвращается, когда IObservable вызывает OnComplete() для своих подписчиков. Я специально хочу, чтобы пользователь не использовал наблюдателя, а просто был счастлив, зная, что все, что происходит после его вызова await, произойдет после заполнения коллекции.

Может быть, метод ToTask() помогает? Я не могу точно сказать по документации.


person Santiago Cerón Uribe    schedule 24.02.2015    source источник
comment
Как примечание, вам следует избегать смешивания ваших монад - это меняется между IEnumerable<T>, IObservable<T> и Task<T>. Каждое изменение вводит точку в код, которая может преждевременно вызвать выполнение и/или привести к неожиданному поведению. Наблюдаемые объекты более мощные и выразительные, чем задачи, поэтому лучше оставаться в наблюдаемых.   -  person Enigmativity    schedule 24.02.2015
comment
Кроме того, важно понимать, что хотя наблюдаемые объекты называются коллекциями, они не заполняются. Они существуют во временном измерении, поэтому являются экземплярами объектов, которые возникают как экземпляры во времени. Это временная шкала, которая может закончиться, а может и не закончиться.   -  person Enigmativity    schedule 24.02.2015
comment
Похоже, вы должны использовать Task полностью. У вас нет потока, только один результат.   -  person user630190    schedule 24.02.2015


Ответы (1)


Если вы используете Rx 2.0 или более позднюю версию, вы можете await IObservable вернуть последний элемент в наблюдаемом. т.е. после завершения наблюдаемого.

var lastItem = await myObservable;

Это возможно, потому что в Rx 2.0 был добавлен GetAwaiter метод расширения для IObservable, делающий возможным await наблюдаемые объекты. Есть также несколько удобных методов расширения, которые позволяют вам указать, какой элемент вы хотите ожидать.

Об этом есть хороший блог здесь.

person NeddySpaghetti    schedule 24.02.2015