Пользовательский интерфейс довольно естественно обновляется в потоке пользовательского интерфейса.События для таких вещей, как нажатия кнопок, также запускаются в потоке пользовательского интерфейса.
В некоторых случаях изменения свойств и вызовы методов в элементах управления приводят к отправке метода в поток пользовательского интерфейса.Это означает, что метод, который должен быть вызван, фактически не будет происходить, пока поток пользовательского интерфейса не станет доступным для его выполнения (и все остальное, уже помещенное в очередь, уже выполнено).IsBusy
попадает в эту категорию.
Только после того, как ваш код закончил с потоком пользовательского интерфейса, пользовательский интерфейс сможет обновить свой внешний вид.Вы не должны делать никаких длительных задач в потоке пользовательского интерфейса.В вашем случае вы связываете поток для выполнения собственных ставок и оставляете UI голодным для этого единственного потока, который он может использовать для выполнения своей работы.
Вместо этого вы должны использовать класс BackgroundWorker
и выполнятьвся тяжелая работа в его событии DoWork
, которое выполняется в другом потоке.
myButton_Click(object sender, RoutedEventArgs e)
{
isbusyindicator1.IsBusy = true;
var bw = new BackgroundWorker();
bw.DoWork += (s, args) =>
{
//Stuff that takes some time
};
bw.RunWorkerCompleted += (s, args) =>
{
isbusyindicator1.IsBusy = false;
};
bw.RunWorkerAsync();
}
Теперь это событие щелчка завершается очень быстро, позволяя потоку пользовательского интерфейса использовать его для обновления пользовательского интерфейса, пока фактическая работа выполнена.на фоне темы.После завершения IsBusy очищается.