2010-07-08 6 views
0

Я просмотрел несколько примеров, размещенных в Интернете, но я не могу ответить на мой вопрос.Как обновить пользовательский интерфейс Silverlight при обработке

У меня есть переменная 'p', которая увеличивается на 1 в цикле for. Я хочу, чтобы пользовательский интерфейс отображал ход вычисления (чтобы показать, как «p» увеличивается с 0 до 1000000). Я делаю расчет в отдельном потоке и диспетчер звонков, чтобы обновить ResultBox в пользовательском интерфейсе. Пример:

int p=0; 

... 

private void GO(object sender, System.Windows.RoutedEventArgs e) 
{ 
     new Thread(delegate() 
     { 
      DoWork(); 
     }).Start(); 

}

void DoWork() 
    { 
     for (int i = 0; i < 1000; i++) 
     { 
      for (int j = 0; j < 10000; j++) 
      { 
       p++; 
       this.Dispatcher.BeginInvoke(delegate { ResultBox.Text = p.ToString(); }); 
      } 
     } 

    } 

По какой-то причине это не работает. Однако, когда я помещал Thread.Sleep (1) непосредственно перед этим. Dispatcher ... он работает по назначению. Означает ли это, что обновление пользовательского интерфейса (Диспетчер) вызывается слишком часто, поэтому оно зависает? Есть ли другой способ сделать это?

Спасибо

+0

Я достиг этого, добавив диспетчер времени, который обновляет интерфейс с интервалом = нуль. Тем не менее, ваше объяснение по-прежнему необходимо, потому что, когда я следую концепции, представленной в коде выше, работает отлично в WPF. – Marcin

ответ

0

Да только делает р ++ в цикле не займет много времени, так и внутри Silverlight, грузоотправитель не что иное, как простой очереди с делегатами и перед Silverlight может даже обновлять и обрабатывать свой пользовательский интерфейс, вы перекачивая слишком много значений в очереди. Представьте, что произойдет, если вы продолжите добавление очереди быстрее, тогда очередь будет удалена, а затем она также достигнет максимального предела. И в конце концов он просто остановится. Если ваш p ​​++ заменен более трудоемкой задачей, вы можете получить хороший результат.

Вы должны знать, что наш глаз обычно может видеть только обновления 30 кадров в секунду, более 30 обновлений в секунду вообще не будут использоваться, я предлагаю обновить ваше представление до 10 обновлений в секунду лучшее представление.

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

void DoWork() 
{ 
    for (int i = 0; i < 1000; i++) 
    { 
     for (int j = 0; j < 10000; j++) 
     { 
      p++; 
      if((p % 1000)==0){ 
       this.Dispatcher.BeginInvoke(delegate 
         { ResultBox.Text = p.ToString(); }); 
      } 
     } 
    } 

} 

Теперь вы можете increaes/уменьшение 1000 до некоторой подходящей Multipler 10 для настройки визуального обновления.

1

Почему бы не связать свойство с вашим TextBox и обновить значение свойства вместо того, чтобы тыкать в текстовое поле напрямую?

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