Как получить функциональность IObservable <T>.ToTask в Silverlight - PullRequest
0 голосов
/ 04 апреля 2011

Как я могу добиться поведения, которое вы получаете с помощью метода IObservable ToTask в Silverlight, где TPL не предоставляется?Я хочу, чтобы исключения повышались в качестве IEnumerable и могли блокироваться и ждать завершения Observable.

Вот пример того, что я делаю с ToTask:

int collectionSize = 200;
service.Collection.CreateSampleCollection(size: collectionSize).Wait();
var query = (QuerySource)service.Collection.CollectionTestModel.All();
var queryTask = query.ToTask();
query.Fetch();
var entities = queryTask.Result;
CollectionAssert.AreEquivalent(entities.Select(e => (int)(long)e["Number"]), Enumerable.Range(0, collectionSize));
service.Collection.DeleteTestCollection().Wait();

Итак, что было бы простым способом перевести этот код в другие расширения RX?Используя Run, мне нужно добавить onNext и onError (?), И я должен агрегировать результаты в onNext.Есть ли более простой способ сделать это?

Ответы [ 2 ]

2 голосов
/ 04 апреля 2011

Вы можете использовать First() для блокировки, пока не появится доступное значение (аналогично, Last также блокирует).

Если вам нужно все значения, вы можете загрузить последнюю сборку Rx и использовать .ToArray().First().

1 голос
/ 05 апреля 2011

И если у вас нет последней сборки Rx, ToList достаточно просто написать:

public static List<T> ToList<T>(this IObservable<T> This)
{
    return This.Aggregate(new List<T>(), (acc, x) => {
        acc.Add(x);
        return acc;
    }).First();
}
...