C# Отмена асинхронного метода блокирует изменение полей

113
22 марта 2021, 05:20

Использую WPF, MVVM паттерн. На ряду с использованием метода Webclient.DownloadFileTaskAsync() отдельным методом вынес и WebClient.CancelAsync(), который тригерится нажатием кнопки. В том же метода идет передача вместе с изменением поля Label в форме. Получилось так:

            CancelDownloading = new DelegateCommand(() =>
            {
               MessageProgress = "Скачивание отмененно"; //Передача состояния в Label
               _downloader.CancelDownload(); //Отмена асинхронной операции
            });

И все ничего, но при тригере этого метода с помощью Button происходит только остановка загрузки. При повторном только нажатии изменяется поле Label. Поле, в которое передается MessageProgress обернуто в свойство:

    private string messageProgress;
    public string MessageProgress
    {
        get { return messageProgress; }
        set { SetProperty(ref messageProgress, value); }
    }

Почему изменение происходит только после повторного нажатия Button?

Update

Изначально упустил момент, что MessageProgress принимает значения из другого метода, который передает значение Webclient.DownloadProgressChange. Тем не менее, в дебагере видно, что значение изменено, но в UI значение не обновилось, только остановился процесс загрузки (ProgressBar в том числе).

Весь класс Downloader, отмена идет метода DownloadAllFiles

class Downloader:INotifyPropertyChanged
{
#region INPC progress
    private int _progress;
    public int counter = 1;
    protected void OnPropertyChanged(PropertyChangedEventArgs e)
    {
        PropertyChanged?.Invoke(this, e);
    }
    protected void OnPropertyChanged(string propertyName)
    {
        OnPropertyChanged(new PropertyChangedEventArgs(propertyName));
    }
    public int Progress
    {
        get { return _progress; }
        set
        {
            if (value != _progress)
            {
                _progress = value;
                OnPropertyChanged("Progress");
            }
        }
    }
    #endregion
    WebClient wc = new WebClient();
    public async Task DownloadAllFiles(Dictionary<string, bool> context, string pathFile)
    {
        wc.DownloadProgressChanged += Download_Changing;
        foreach (KeyValuePair<string, bool> pair in context)
        {
            string result = pair.Key.Substring(pair.Key.IndexOf("src/") + 14);
            string fileName = pathFile + @"\" + result;
            await wc.DownloadFileTaskAsync(pair.Key, fileName);
            counter++;
        }
        wc.Dispose();
    }
    private void Download_Changing(object s, DownloadProgressChangedEventArgs e)
    {
        ProgrChanged(this, new ProgressEventArgs(e.ProgressPercentage));
    }
    public void CancelDownload()
    {
        wc.CancelAsync();
    }
    public event PropertyChangedEventHandler PropertyChanged;
    public event EventHandler<ProgressEventArgs> ProgrChanged;
}
READ ALSO
WPF Група одинаковых елементов с одним id

WPF Група одинаковых елементов с одним id

Например есть поле и 2 кнопки, одна добавляет, каждый раз, после нажатия в поле число, а другая кнопка- убирает

110
Visual Studio’s Emulator for Android что с ним стало?

Visual Studio’s Emulator for Android что с ним стало?

Описание эмулятора здесьНо это какая-то волшебная страница

246
Как правильно генерировать ключ RSA-2048?

Как правильно генерировать ключ RSA-2048?

Подскажите как правильно сгенерировать приватный и закрытый ключ именно для RSA-2048

103
Подокно в основном окне в Winforms

Подокно в основном окне в Winforms

У некоторых программ я видел такую картину:есть само окно и внутри него еще одно окно, вот как на пример в программе Origin: Есть основное окно...

92