Как показывать и убирать ProgressBar во время клика по CheckBox

Заранее извиняюсь если не совсем корректно сформировал заголовок (не знаю как правильно сформировать мысль в виде короткого вопроса)

У меня есть wpf grid на котором есть ProgressBar (MainProgressBar) и есть CheckBox

Функция Click у чекботса выглядит:

private void CheckBox_Checked(object sender, RoutedEventArgs e)
{
   MainProgressBar.Visibility = Visibility.Visible;

   // Здесь функции, в которых я изменяю объекты на форме, например, создаю карту на бэкграунде
   // Выполнение функций занимает более 1 минуты       

   MainProgressBar.Visibility = Visibility.Hidden;
} 

Код отрабатывает, но при нажатии на чекбокс, вместо ProgressBar зависает все приложение и в итоге прогрессбара я не вижу, а только лишь конечный результат.

Как сделать показ прогрессбара перед выполнением тяжелых функций и его убирание.


Ответы (1 шт):

Автор решения: Pavel Popov

Набросал простой пример. Почитайте про Task + async/await. Ваша тяжелая задача занимает время основного потока, что логично приводит к зависанию UI. Все тяжелые задачи выполняйте в отдельных потоках. Придерживайтесь правила - основной поток только для UI и легких задач, все тежелое выполняется в отдельных потоках(Task - отличный инструмент) Сразу предупреждаю, захотите что то изменять с UI внутри таска(а это отдельный поток) например наращивать прогресс в MainProgressBar, напрямую не получится. UI можно изменять только в основном потоке! Используйте ф-ю Invoke у контрола или формы и почитайте про Dispatcher

private async void CheckBox_Checked(object sender, RoutedEventArgs e)
{
   MainProgressBar.Visibility = Visibility.Visible;

   await Task.Run(()=>{
       // Здесь функции, в которых я изменяю объекты на форме, например, создаю карту на бэкграунде
   // Выполнение функций занимает более 1 минуты     
});
  
   MainProgressBar.Visibility = Visibility.Hidden;
} 
→ Ссылка