public void StartDownload(QueuedDownload download, bool resume = false, bool forceNow = false) { if (queuedDownloads.Contains(download) || startedDownloads.Keys.Contains(download)) { return; } if (resume) { queuedDownloads.Insert(0, download); } else if (!forceNow) { queuedDownloads.Add(download); _downloadEnqueuedEvent.OnNext(download); } if (forceNow) { QueuedDownload nextDownload = null; if (startedDownloads.Count >= KMaxSimultaneousDownloads) { nextDownload = startedDownloads.Keys.First(); } IDownloadCancelHandle cancelHandle = StartEnqueuedDownload(download); startedDownloads.Add(download, cancelHandle); if (nextDownload != null) { StopDownload(nextDownload, true); } } else { StartEnqueuedItemsIfPossible(); } }
private void StartEnqueuedItemsIfPossible() { while (startedDownloads.Count < KMaxSimultaneousDownloads && queuedDownloads.Count > 0) { QueuedDownload download = queuedDownloads.PopFirst(); IDownloadCancelHandle cancelHandle = StartEnqueuedDownload(download); startedDownloads.Add(download, cancelHandle); } }