Прогрессбар не отображается, когда неопределен (WPF)? - PullRequest
1 голос
/ 22 января 2020

вчера я опубликовал это: Как обрабатывать UnauthorizedAccessException в асинхронном коде? Кто-то сказал, что лучше оставить Task.Run оттуда, потому что это не нужно.

Я так и сделал, но теперь возникла другая проблема. Это код без asyn c, но я удалил только аргументы asyn c, так что если вы хотите скопировать код go в мой предыдущий пост. https://imgur.com/Oxo9DnV

Моя текущая проблема заключается в следующем коде:

    progressBar.IsIndeterminate = true;
    progressBar.Visibility = Visibility.Visible;
    youtubeConverter.ConvertVideoAndDownloadToFolder(txtInputLink.Text);
    progressBar.Visibility = Visibility.Collapsed;

При вызове этого метода индикатор выполнения не отображается. Даже если вы удалите последнюю строку, она станет видимой только после того, как метод будет выполнен, даже если я попрошу, чтобы индикатор выполнения отображался прямо перед этим. Индикатор выполнения работает без метода, поэтому я не понимаю, почему это происходит. (Я говорю о ConvertVideoAndDownloadToFolder() методе)

Другими словами, я хочу, чтобы мой индикатор выполнения отображался при загрузке метода, чтобы пользователь знал, что приложение занято и не застряло. Что я здесь не так делаю?

Большое спасибо, хорошего дня.

1 Ответ

1 голос
/ 22 января 2020

Поток пользовательского интерфейса не может отобразить ProgressBar и одновременно выполнить метод ConvertVideoAndDownloadToFolder.

Вы должны выполнить ConvertVideoAndDownloadToFolder в фоновом потоке. Самый простой способ сделать это - создать Task. После завершения задачи вы установите Visibility обратно на Collapsed в потоке пользовательского интерфейса:

progressBar.IsIndeterminate = true;
progressBar.Visibility = Visibility.Visible;
string s = txtInputLink.Text;
Task.Factory.StartNew(() => youtubeConverter.ConvertVideoAndDownloadToFolder(s))
    .ContinueWith(_ => progressBar.Visibility = Visibility.Collapsed,
        CancellationToken.None, TaskContinuationOptions.None, TaskScheduler.FromCurrentSynchronizationContext());

Если вы находитесь в контексте метода async, вы можете упростить это, ожидая задание:

progressBar.IsIndeterminate = true;
progressBar.Visibility = Visibility.Visible;
string s = txtInputLink.Text;
await Task.Run(() => youtubeConverter.ConvertVideoAndDownloadToFolder(s));
progressBar.Visibility = Visibility.Collapsed;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...