2016-06-09 9 views
-1

Поэтому у меня есть очень простое приложение для Windows, где я хочу считать от 1 до 10000 и показать номера в этикетке:компоненты Обновление GUI из BeginInvoke

private void button1_Click(object sender, EventArgs e) 
    { 
     Thread thread = new Thread(() => 
     { 
      for (int i = 0; i < 10000; i++) 
      { 
       BeginInvoke((MethodInvoker)delegate() 
       { 
        label3.Text = i.ToString(); 
       }); 
      } 
     }); 

     thread.Start(); 
} 

Проблема заключается в том, что текст метки не обновление и показывает только последний счетчик циклов, т.е. 9999. Is BeginInvoke вызывается в потоке пользовательского интерфейса? Почему метка не обновляется правильно?

Спасибо.

+0

Вы хотите, чтобы число увеличивалось каждый раз, когда вы нажимаете кнопку? – LaneL

+0

@LaneL Нет, я хочу нажать кнопку и увидеть цифры до 10000. – user3723486

+0

Использовать фоновый рабочий вместо этого ... см. Подробности здесь - https://msdn.microsoft.com/en-us/library/cc221403%28v = vs.95% 29.aspx – Sanket

ответ

2

Поскольку BeginInvoke - это асинхронный вызов, вы отправляете слишком много обновлений в текстовое поле, чтобы оно было достаточно быстро обновлено, к тому времени, когда текстовое поле добралось до чертежа, оно уже подсчитано до 10000!

Вы можете синхронно обновлять текст, т. Е. Цикл вызова будет остановлен до тех пор, пока текстовое поле не будет обновлено и не закончено, используйте Invoke вместо BeginInvoke.

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

  • Нет связанных вопросов^_^