Диспетчерский обратного вызова будет в возможно 100% случаев пожара после линии
radbusyIndicator.IsRunning = false
.
Попробуйте следующий вместо:
public MainPage()
{
InitializeComponent();
DataContext = App.Model;
this.Dispatcher.BeginInvoke(new Action(() =>
{
radbusyIndicator.IsRunning = true;
SampleData.Data.getInfo();
SampleData.Data.getData();
radbusyIndicator.IsRunning = false;
}));
}
Это происходит потому, что сам акт сортировочного вызова в поток пользовательского интерфейса занимает несколько циклов центрального процессора и оригинальный radbusyIndicator.IsRunning = false
довольно много следующая строка для запуска.
Это не имеет значения, так как вы либо получите кратковременное мерцание индикатора занятости, либо оно останется на экране навсегда, так как вы его не скроете после работа выполнена, вы ее скрываете немедленно
Edit:
Да игнорировать, что в прошлом один - понял, что это не будет работать:
Если методы асинхронной, индикатор будет скрывать немедленно, если они не ASync, пользовательский интерфейс нить будет заблокирована, пока они работают
Если ваши методы синхронизации вам нужно, чтобы сделать работу в другом потоке и обновления маршалом UI в потоке пользовательского интерфейса с помощью диспетчера
Вы можете использовать BackgroundWorker
, чтобы сделать работу в другом потоке:
http://msdn.microsoft.com/en-us/library/cc221403%28v=vs.95%29.aspx
BackgroundWorker bw = new BackgroundWorker();
private void bw_DoWork(object sender, DoWorkEventArgs e)
{
this.Dispatcher.BeginInvoke(new Action(() =>
{
radbusyIndicator.IsRunning = true;
}));
SampleData.Data.getInfo();
SampleData.Data.getData();
this.Dispatcher.BeginInvoke(new Action(() =>
{
radbusyIndicator.IsRunning = false;
}));
}
Тогда в конструкторе:
bw.DoWork += new DoWorkEventHandler(bw_DoWork);
bw.RunWorkerAsync();
скорее всего 'IsRunning = false' Виль l выполняется до вызова метода диспетчера (условие гонки ... на самом деле, вероятно, никогда не будет getInfo и getData до последней строки). Вам нужно положить 'IsRunning = false' в обратный вызов диспетчера – Charleh
Я не знаю, если это разрешено, но вы пытались вызвать radbusyIndicator.IsRunning = false; в методе Action()? после SampleData.Data.getData(); – Owidat