如何在没有提供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中聚合结果。有更简单的方法吗?
答案 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();
}