Диспетчер здесь не поможет, и вот почему: вы закидываете в UI поток работу, которая встает в очередь. А разгребаться эта очередь будет тогда, когда UI поток освободится. А освободится он тогда в данном случае, когда обработчик события полностью завершит работу.
Подозреваю, что идет работа с файловой системой. Набросаю механизм, который позволит сделать то что нужно.
Пусть SomeProcess это синхронный метод, работающий с какими-то структурами данных, и одновременно в других потоках с ними ничего не работает. Так же предположим, что SomeProcess не работает с UI. Тогда прокатит следующее решение - асинхронный метод.
private async void ButtonStart_Click(object sender, RoutedEventArgs e)
{
ButtonStart.IsEnabled = false;
try
{
ProgressBarLabel.Content = "Поиск всех файлов";
await Task.Run(SomeProcess); // или await Task.Run(() => SomeProcess()), без разницы
MessageBox.Show("Работа завершена");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
ButtonStart.IsEnabled = true;
}
Task.Run вереводит выполнения кода метода SomeProcess в другой поток. Обратите внимание, вы не можете работать с контролами из этого потока напрямую. Можно либо через диспетчер, либо с помощью IProgress<T>, либо надо превращать сам метод SomeProcess в асинхронный и избавляться от Task.Run, если есть такая возможность.
Как работать с IProgress<T>, я показывал здесь, здесь, здесь и здесь, и еще много где.
Labelв WPF не используют. В WPF для отображения текста используютTextBlock. Советую заменить. – aepot Jan 19 '23 at 07:54