/// <summary> /// Finds the next file to download /// </summary> protected virtual DownloadRequest GetNextDownloadRequest() { DownloadRequest bestRequest = null; float highestScore = float.MinValue; lock (m_requests.SyncRoot) { for (int i = m_requests.Count - 1; i >= 0; i--) { DownloadRequest request = (DownloadRequest)m_requests[i]; if (request.IsDownloading) { continue; } float score = request.CalculateScore(); if (float.IsNegativeInfinity(score)) { // Request is of no interest anymore, remove it m_requests.RemoveAt(i); request.Dispose(); continue; } if (score > highestScore) { highestScore = score; bestRequest = request; } } } return(bestRequest); }
/// <summary> /// Add a download request to the queue. /// </summary> public virtual void Add(DownloadRequest newRequest) { if (newRequest == null) { throw new NullReferenceException(); } lock (m_requests.SyncRoot) { foreach (DownloadRequest request in m_requests) { if (request.Key == newRequest.Key) { newRequest.Dispose(); return; } } // don't forget to also check the currently active downloads! foreach (DownloadRequest request in m_activeDownloads) { if (request.Key == newRequest.Key) { newRequest.Dispose(); return; } } m_requests.Add(newRequest); if (m_requests.Count > MaxQueueLength) { // Remove lowest scoring queued request DownloadRequest leastImportantRequest = null; float lowestScore = float.MinValue; for (int i = m_requests.Count - 1; i >= 0; i--) { DownloadRequest request = (DownloadRequest)m_requests[i]; if (request.IsDownloading) { continue; } float score = request.CalculateScore(); if (score == float.MinValue) { // Request is of no interest anymore, remove it m_requests.Remove(request); request.Dispose(); return; } if (score < lowestScore) { lowestScore = score; leastImportantRequest = request; } } if (leastImportantRequest != null) { m_requests.Remove(leastImportantRequest); leastImportantRequest.Dispose(); } } } ServiceDownloadQueue(); }