OriginalGriff
Проблема в том, что вы запускаете этот код в потоке пользовательского интерфейса - потому что в противном случае вы получите "ошибку перекрестной потоковой передачи", а это означает, что код, ответственный за обновление вашего дисплея, не может работать до тех пор, пока этот метод не завершится. Поскольку он не выходит, а вместо этого переходит в спящий режим, он не работает для обновления дисплея, поэтому вы никогда не увидите изменения номера.
Есть способы получить то, что вы хотите - то есть метка меняется каждую секунду, - но именно то, как вы это делаете, зависит от среды, в которой вы работаете: например, решение WinForms будет отличаться от решения на основе веб-сайта. И есть разные способы сделать это, в зависимости от того, насколько сложным вы можете справиться и сколько плохого кода Вы можете терпеть.
Я собираюсь принять решение WinForms, и поскольку вы новичок, я также проигнорирую вариант "плохой код" по причинам, которые потребовалось бы слишком много времени, чтобы объяснить.
Это оставляет вам два варианта:
1) многопоточность.
2) таймер.
Опция потоковой передачи становится очень сложной, потому что вам нужно создать новый поток, а затем передать некоторый код обратно в исходный поток, чтобы фактически изменить метку (или вы получите ошибку перекрестной потоковой передачи, о которой я упоминал ранее), поэтому я собираюсь положить ее на полку и объяснить самый простой "правильный" способ сделать это.
Удалите свой цикл.
Создайте целое число уровня класса, называемое count
.
private int count = 0;
Добавьте экземпляр таймера уровня класса, называемый
updateLabel
private System.Windows.Forms.Timer updateLabel = new System.Windows.Forms.Timer();
В событие click, добавьте этот код:
updateLabel.Interval = 1000;
updateLabel.Tick += updateLabel_Tick;
updateLabel.Start();
Теперь добавьте обработчик для события Tick:
void updateLabel_Tick(object sender, EventArgs e)
{
label1.Text = "Processing " + (++count).ToString();
}
Запустите свой код.