#c_sharp
Как обновлять текст в Label`е с определенной частотой(1 сек. например)?.пробовал такой код: for (; ; ) { Task.Delay(1000); countDownLabel.Content = String.Format(/*подстановка обновляемого текста*/); } ,но окно виснет.Как решить проблему?
Ответы
Ответ 1
Виснет, потому что вы не ожидаете таск: метод Task.Delay возвращает управление сразу и вы т.о. сильно нагружаете UI перерисовкой. Правильнее так: for (; ; ) { await Task.Delay(1000); countDownLabel.Content = String.Format(/*подстановка обновляемого текста*/); } Возможно, что вам захочется уметь останавливать обновление: private async Task UpdateLabel(CancellationToken cancellationToken) { while (!cancellationToken.IsCancellationRequested) { await Task.Delay(1000); countDownLabel.Content = String.Format(/*подстановка обновляемого текста*/); } } private void Do() { // обновляем лейбл в течение 10 секунд var tokenSource = new CancellationTokenSource(TimeSpan.FromSeconds(10)); UpdateLabel(tokenSource.Token); } Если с async/await вы не очень знакомы, можете использовать таймер. Не забудьте про Control.Invoke для доступа к элементам интерфейса. timer = new Timer(UpdateLabel, null, 1000, 1000); ... private void UpdateLabel() { if (countDownLabel.InvokeRequired) { countDownLabel.Invoke(UpdateLabel); } else { countDownLabel.Content = String.Format(/*подстановка обновляемого текста*/); } } ... timer.Dispose();
Комментариев нет:
Отправить комментарий