private async void Download_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                rowCount++;

                var cancelButtonCreator = new CancelButtonCreator();
                cancelButtonCreator.RowCount = rowCount;
                var newCancelButton = cancelButtonCreator.CreateButton();

                var progressBarCreator = new ProgressBarCreator();
                progressBarCreator.RowCount = rowCount;
                progressBarCreator.CreateProgressBar();
                var currentProgressBar = progressBarCreator.CreateProgressBar();

                Bars.Children.Add(currentProgressBar);
                Buttons.Children.Add(newCancelButton);

                var downloadObjectCreator = new DownloadObjectCreator();
                downloadObjectCreator.Url         = Link.Text;
                downloadObjectCreator.ProgressBar = new Progress <int>();

                await Downloader.DownloadFile(downloadObjectCreator, currentProgressBar, cancelButtonCreator.CancellationTokenSource);
            }
            catch (Exception exception)
            {
                MessageBox.Show(exception.ToString());
            }
        }
示例#2
0
        public static async Task DownloadFile(DownloadObjectCreator downloadObjectCreator, ProgressBar progressBar, CancellationTokenSource token)
        {
            try
            {
                using (var client = new HttpClient())
                    using (var response = await client.GetAsync(downloadObjectCreator.Url, token.Token))
                        using (var content = response.Content)
                            using (var outputStream = new FileStream(downloadObjectCreator.GetDestinationPath(), FileMode.OpenOrCreate, FileAccess.Write))
                            {
                                var buffer = new byte[1024];
                                var stream = await content.ReadAsStreamAsync();

                                do
                                {
                                    if (token.IsCancellationRequested)
                                    {
                                        break;
                                    }
                                    var read = await stream.ReadAsync(buffer, 0, buffer.Length);

                                    await Task.Delay(200);

                                    progressBar.Value += Math.Abs((double)read / stream.Length * 100);
                                    downloadObjectCreator.ProgressBar.Report((int)progressBar.Value);
                                    await outputStream.WriteAsync(buffer, 0, read);
                                } while (stream.Length > 0);
                            }
            }
            catch (Exception e)
            {
                MessageBox.Show(e.ToString());
            }
        }