我有完成的操作列表,我想返回一个observable,当所有的observable都完成时会通知它(返回操作的状态是最好的):
foreach (var id in service.FetchItems().ToEnumerable().ToArray())
{
service.Delete(id); // <- returns IObservable<Unit>
}
// something.Wait();
service.FetchItems()
返回IObservable<string>
,service.Delete(...)
返回IObservable<Unit>
以下方法是否正确?
service.FetchItems().ForEachAsync(id => service.Delete(id)).ToObservable().Wait();
答案 0 :(得分:2)
我会避免所有等待和任务,并坚持使用普通的RX。
尝试这种方法:
var query =
from id in service.FetchItems()
from u in service.Delete(id)
select id;
query
.ToArray()
.Subscribe(ids =>
{
/* all fetches and deletes done now */
});
Rx中的.ToArray()
运算符将IObservable<T>
返回零或更多T
并返回IObservable<T[]>
,返回包含零的单个数组或仅在源可观察完成时T
。{/ p>
答案 1 :(得分:0)
ToEnumerable
阻塞等待序列中的下一个元素。你可以这样做:
Task delAllTask = service.FetchItems()
.SelectMany(service.Delete)
.ToTask();
然后你可以阻止任务或异步继续,例如。
delAllTask.Wait();
delAllTask.ContinueWith(...);