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