С# Mega.nz | Скачивание файла с progress bar'ом

103
03 июня 2021, 10:10

Хочу сделать скачивание файла с Mega.nz с прогресс баром. Я могу скачать файл, но как добавить прогресс бар... Ничего не понимаю. Вот API https://gpailler.github.io/MegaApiClient/articles/faq.html

Answer 1

Обновлять прогресс можно так, как показано в примере кода.

_progressBar.Maximum = 1000; и (int)(value * 10d); могут быть заменены на _progressBar.Maximum = 100; и (int)(value);

Можно использовать стандартный дотнетовский Progress<T> класс. Я написал свой, так как не знал о его существовании, подсказали в комментариях.

using System;
using System.Threading;
namespace FileDownloader
{
    public class Progress : IProgress<double>
    {
        private readonly SynchronizationContext _synchronizationContext;
        public event EventHandler<double> ProgressUpdated;
        public Progress()
        {
            _synchronizationContext = 
                SynchronizationContext.Current ?? new SynchronizationContext();
        }
        public void Report(double value)
        {
            _synchronizationContext.Post(state =>
            {
                ProgressUpdated?.Invoke(this, value);
            }, null);
        }
    }
}
using System;
using System.Diagnostics;
using System.Globalization;
using System.Threading;
using System.Windows.Forms;
using CG.Web.MegaApiClient;
namespace FileDownloader
{
    public partial class MainForm : Form
    {
        // ...
        private readonly Progress _progress;
        public MainForm()
        {
            InitializeComponent();
            // ...
            _progress = new Progress();
            _progress.ProgressUpdated += OnProgressUpdated;
            _progressBar.Minimum = 0;
            _progressBar.Maximum = 1000;
        }
        private void OnProgressUpdated(object sender, double value)
        {
            updateProgress(value);
        }
        private async void DownloadButtonClick(object sender, EventArgs e)
        {
            // Лучше добавить ещё код вида: 
            // если скачивание запущено, то выйти из метода.
            // Этот код нужно добавить, даже если кнопка 
            // выключается на время скачивания.
            // А то иногда мелькают вопросы: "как сделать
            // неактивную кнопку активной?"
            // ...
            await _client.LoginAnonymousAsync();
            // ...
            try
            {
                await client.DownloadFileAsync(fileLink, node.Name, _progress/*, _cancellation.Token*/);
            }
            catch (OperationCanceledException ex)
            {
                updateProgress(0d);
                Debug.WriteLine(ex.Message);
            }
            finally
            {
                // ...
            }
        }
        private void updateProgress(double value)
        {
            _percentageLabel.Text = ((int)value).ToString(CultureInfo.InvariantCulture) + "%";
            _progressBar.Value = (int)(value * 10d);
        }
    }
}
READ ALSO
c#, visual-studio, интеграция отладки в код

c#, visual-studio, интеграция отладки в код

Существуют ли наработанные подходы к интеграции отладки в код?

207
c# компиляция проекта без visual studio

c# компиляция проекта без visual studio

как компилировать программу wpf без студии? пишу в консоли:

114
502 bad gateway donationalerts

502 bad gateway donationalerts

Всем привет, решил написать программу для обработки донатов на donationalerts, работают они через виджет в виде страницы и через F12 я понял что получают...

161
Как поднять дные выше и вывести их PHP 7.1

Как поднять дные выше и вывести их PHP 7.1

Всем привет, прошу помочь в решение очень сложного вопроса (Мучаюсь с ним уже 4 дня)

91