2011-04-04 50 views
0

如何在Silverlight中使用IObservable ToTask方法實現您未獲得TPL的行爲? 我希望異常獲得提升結果作爲IEnumerable並能夠阻止並等待Observable完成。如何獲得IObservable <T> .ToTask Silverlight中的功能

這裏是什麼,我有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擴展翻譯這個代碼的簡單方法嗎? 使用運行我必須添加onNext和onError(?),我必須在onNext上聚合結果。有沒有更簡單的方法來做到這一點?

回答

2

您可以使用First()來阻止,直到有可用值(同樣,Last也是塊)。

如果您需要全部的值,您可以download the latest build of Rx並使用.ToArray().First()

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(); 
} 
+0

'ToArray' /'ToList'是無阻塞(返回'的IObservable ')所以我會刪除'First()'來正確地複製它。 – 2011-04-05 09:59:42