C# Передача данных из асинхронного метода

83
18 марта 2021, 07:10

Есть метод, который асинхронно выполняет загрузку файлов, как задачу методом WebClient.DownloadFileTaskAsync. У WebClient есть встроенный индикатор выполнения - DownloadProgressChanged. Если полю присваивать значение в методе, то ProgressBar работает отлично. Но если делать передачу из другого класса (по MVVM паттерну), то передача не осуществляется. Код метода:

class Downloader
{
    private int _progress;
    public int Progress
    {
        get { return _progress; }
        set { _progress = value; }
    }
    public async Task DownloadManyFiles(List<string> context, string pathFile)
    {
        WebClient wc = new WebClient();
        wc.DownloadProgressChanged += (s, e) => Progress = e.ProgressPercentage;
        foreach (var b in context)
        {
            string result = b.Substring(b.IndexOf("src/") + 14);
            string fileName = pathFile + @"\" + result;
            await wc.DownloadFileTaskAsync(b, fileName);
        }
        wc.Dispose();
    }
}

И код в ViewModel:

    private int _currentProgress;
    public int CurrentProgress
    {
        get { return _currentProgress; }
        set { SetProperty(ref _currentProgress, value); }
    }
    public ViewModel()
    {
        DownloadContent = new DelegateCommand<List<string>>(param =>
        {
            _downloader.DownloadManyFiles(_context.UrlsList, CurrentPath);
            CurrentProgress = _downloader.Progress;
        });
    }
    public DelegateCommand<List<string>> DownloadContent { get; }

И наконец, привязка ProgressBar:

<ProgressBar Minimum="0" Maximum="100" Value="{Binding CurrentProgress, Mode=OneWay}" Height="40" Width="340"/>
READ ALSO
Ускорение работы программы

Ускорение работы программы

Проблема заключается в том, что моя программа не может справится со своей задачей, слишком много данных проходит один поток данных

86
Telegram winapi открытие канала без браузера

Telegram winapi открытие канала без браузера

Всем привет, если в браузере вставить ссылку на канал https://tme/durov, то при условии если установлен телеграм, то вы автоматически перейдете на этот...

81
Как каждую секунду вызывать метод?

Как каждую секунду вызывать метод?

В WPF/MVVM игре есть модель часов, которые изменяются каждую секундуА в другой модели описаны свойства игрока - голод и усталость

101
Как дождаться завершение анимации ? Unity

Как дождаться завершение анимации ? Unity

При выключении панели (метод Hide): включить анимацию, дождаться завершения анимации, а только потом выключать объект (методом SetActive(false))Event...

86