如何将一个任务列表转换为一个Observable并在元素完成时处理它们?

Kru*_*lur 7 c# system.reactive

鉴于以下集合Tasks:

var americanAirlines = new FlightPriceChecker("AA");
...
var runningTasks = new List<Task<IList<FlightPrice>>>
{
    americanAirlines.GetPricesAsync(from, to),
    delta.GetPricesAsync(from, to),
    united.GetPricesAsync(from, to)
};
Run Code Online (Sandbox Code Playgroud)

我想GetPricesAsync()按照他们到达的顺序处理结果.目前,我正在使用while循环来实现此目的:

while (runningTasks.Any())
{
    // Wait for any task to finish
    var completed = await Task.WhenAny(runningTasks);
    // Remove from running list   
    runningTasks.Remove(completed);
    // Process the completed task (updates a property we may be binding to)
    UpdateCheapestFlight(completed.Result);
}
Run Code Online (Sandbox Code Playgroud)

这是一个可以使用Rx更优雅地解决的问题吗?我试图用类似下面的代码,但卡住了,因为地方我不得不awaitgetFlightPriceTask这将阻止,然后才执行下一个,而不是采取的第一个这样做了,然后等待下一次:

runningTasks
  .ToObservable()
  .Select(getFlightPriceTask => .???.)
Run Code Online (Sandbox Code Playgroud)

Shl*_*omo 6

尝试这个:

runningTasks
  .Select(getFlightPriceTask => getFlightPriceTask.ToObservable())
  .Merge()
  .Subscribe(flightPrices => UpdateCheapestFlight(flightPrices))
Run Code Online (Sandbox Code Playgroud)