Обновление компонентов графического интерфейса от Begininvoke

Итак, у меня есть очень простое приложение для Windows, где я хочу сосчитать от 1 до 10000 и показать цифры на этикетке:

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. Вызывается ли BeginInvoke в потоке пользовательского интерфейса? Почему ярлык не обновляется правильно?

Благодарю.

1 ответ

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

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

Другие вопросы по тегам