Beispiel #1
0
        private async Task DownloadFiles(FileDownloadManagerContext context, IEnumerable <FileDownloadManagerItem> items)
        {
            var client = new HttpClient();

            client.DefaultRequestHeaders.CacheControl         = new CacheControlHeaderValue();
            client.DefaultRequestHeaders.CacheControl.NoCache = true;
            client.DefaultRequestHeaders.Add("Connection", "Keep-alive");

            if (context.Timeout != null)
            {
                client.Timeout = context.Timeout;
            }

            IEnumerable <Task> downloadTasksQuery =
                from item in items
                select ProcessUrl(context, client, item);

            // now execute the bunch
            List <Task> downloadTasks = downloadTasksQuery.ToList();

            while (downloadTasks.Count > 0)
            {
                // identify the first task that completes
                Task firstFinishedTask = await Task.WhenAny(downloadTasks);

                // process only once
                downloadTasks.Remove(firstFinishedTask);

                await firstFinishedTask;
            }
        }
Beispiel #2
0
        private async Task ProcessUrl(FileDownloadManagerContext context, HttpClient client, FileDownloadManagerItem item)
        {
            try
            {
                Task <Stream> task = client.GetStreamAsync(item.Url);
                await         task;

                int    count;
                bool   canceled = false;
                byte[] bytes    = new byte[_bufferSize];

                using (var srcStream = task.Result)
                    using (var dstStream = File.OpenWrite(item.Path))
                    {
                        while ((count = srcStream.Read(bytes, 0, bytes.Length)) != 0 && !canceled)
                        {
                            dstStream.Write(bytes, 0, count);

                            if (context.CancellationToken != null && context.CancellationToken.IsCancellationRequested)
                            {
                                canceled = true;
                            }
                        }
                    }

                item.Success = (!task.IsFaulted && !canceled);
            }
            catch (SmartException exc)
            {
                item.Success      = false;
                item.ErrorMessage = exc.ToAllMessages();

                var webExc = exc.InnerException as WebException;
                if (webExc != null)
                {
                    item.ExceptionStatus = webExc.Status;
                }
            }
        }
Beispiel #3
0
 /// <summary>
 /// Start asynchronous download of files
 /// </summary>
 /// <param name="context">Download context</param>
 /// <param name="items">Items to be downloaded</param>
 public async Task DownloadAsync(FileDownloadManagerContext context, IEnumerable <FileDownloadManagerItem> items)
 {
     await DownloadFiles(context, items);
 }