public void StartDownloads()
{
IDownloadItem downloadItem;
while (_numberOfRunningDownloads < _settings.MaximumParallelDownloads
&& (downloadItem = GetNextDownload()) != null)
{
_numberOfRunningDownloads++;
if (_numberOfRunningDownloads == 1)
{
RaiseDownloadingStarted(new EventArgs());
}
_downloadQueue.Remove(downloadItem);
var cancellationTokenSource = new CancellationTokenSource();
_cancellationTokenSources.Add(downloadItem, cancellationTokenSource);
var address = GetDownloadAddress(downloadItem);
var filename = CreateLocalFilename(address);
downloadItem.LocalFilename = filename;
var task = DownloadFileAsync(address, filename, downloadItem, cancellationTokenSource.Token);
var item = downloadItem;
task.ContinueWith(
x =>
{
_numberOfRunningDownloads--;
if (_numberOfRunningDownloads == 0)
{
RaiseDownloadingStopped(new EventArgs());
}
if (x.IsCanceled)
{
_downloadQueue.AddFirst(item);
}
else
{
_finishedDownloadsRepository.AddFinishedDownload(item.RssItem);
StartDownloads();
}
_cancellationTokenSources.Remove(item);
});
}
}