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);
        }