Rx:等待几个可观察量完成

时间:2014-03-26 11:34:47

标签: c# system.reactive

我有完成的操作列表,我想返回一个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();

2 个答案:

答案 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(...);