2013-04-21 7 views
0

Я использую radbusyindicator во время загрузки данных. Но он не работает должным образом. Ниже приведен кодRadbusyindicator не работает должным образом

 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; выполняется. Но я не знаю, как отключить его, как только данные будут загружены. Пробовал много способов, Но не смог заставить его работать. Любая помощь будет оценена

+0

скорее всего 'IsRunning = false' Виль l выполняется до вызова метода диспетчера (условие гонки ... на самом деле, вероятно, никогда не будет getInfo и getData до последней строки). Вам нужно положить 'IsRunning = false' в обратный вызов диспетчера – Charleh

+0

Я не знаю, если это разрешено, но вы пытались вызвать radbusyIndicator.IsRunning = false; в методе Action()? после SampleData.Data.getData(); – Owidat

ответ

0

Диспетчерский обратного вызова будет в возможно 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(); 
+0

спасибо за ответ. попробовал ваш код, но теперь он не показывает индикатор. может быть, он скоро придет и скоро исчезнет – nyfer

+0

Возможно, потому что все методы теперь находятся в потоке пользовательского интерфейса, и вы блокируете поток с работой, которую вы делаете на нем - я обновлю ответ – Charleh

+0

Почему вы не задали свойство IsBusy RadBusyIndicator в XAML до true и переключить его после того, как данные были восстановлены. – mbcrump

Смежные вопросы