void NewNextWait() { var sources = Enumerable.Range(0, WorkerCount).Select(_ => new TaskCompletionSource <bool>()).ToArray(); var whenAll = Task.WhenAll(sources.Select(source => source.Task)).ContinueWith(_ => { WorkerAllDone.TryPop(out var done); NewNextWait(); return(PlaylistView.Next().Result); }); WorkerWaitSources.PushRange(sources); WorkerAllDone.Push(whenAll); }
public async Task <string> Next() { Task <string> done; while (!WorkerAllDone.TryPeek(out done)) { await Task.Delay(10); } if (WorkerWaitSources.TryPop(out var source)) { source.SetResult(true); } return(await done); }