如何获得Silverlight中的IObservable <t> .ToTask功能</t>

时间:2011-04-04 10:44:36

标签: c# .net system.reactive

如何在没有提供TPL的Silverlight中实现IObservable ToTask方法所获得的行为? 我希望异常能够将提升结果作为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 个答案:

答案 0 :(得分:2)

您可以使用First()来阻止,直到有值可用(同样,Last也会阻止)。

如果您需要所有值,您可以download the latest build of Rx并使用.ToArray().First()

答案 1 :(得分:1)

如果您没有最新版本的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();
}
相关问题