Exemplo n.º 1
0
        public async Task <bool?> MoveNextAsync()
        {
            if (CancellationToken.IsCancellationRequested)
            {
                return(false);
            }
            if (position >= Max)
            {
                return(null);
            }
            var pos = Interlocked.Increment(ref position);

            if (pos < tasks.Length)
            {
                var   tsk = tasks[pos]();
                await tsk;
                MovedNext?.Invoke(this, pos);
                return(true);
            }
            else
            {
                Done?.Invoke(this);
            }
            return(false);
        }
Exemplo n.º 2
0
        private void AddCore(DownloadLink link)
        {
            var tokeSource   = new CancellationTokenSource();
            var tasks        = link.Downloader.EmitTasks(link.Request, tokeSource.Token);
            var downloadTask = new DownloadTask(tasks, tokeSource.Token);
            var box          = new DownloadBox(downloadTask, link)
            {
                TokenSource = tokeSource
            };

            box.Canceled           += Box_Canceled;
            downloadTask.MovedNext += (a, b) =>
            {
                MovedNext?.Invoke(this, a, b);
            };
            downloadTask.Seeked += (a, b) =>
            {
                Seeked?.Invoke(this, a, b);
            };
            downloadTask.Done += async w =>
            {
                await RemoveAsync(box.Address);

                Done?.Invoke(this, box);
            };
            downloadMap.Add(link.Request.Entity.ComicUrl, box);
            downloadManager.Add(downloadTask);
            Added?.Invoke(this, box);
        }