Страницы

Поиск по вопросам

вторник, 4 июня 2019 г.

Как обновлять текст в Label`е с определенной частотой?

Как обновлять текст в Label`е с определенной частотой(1 сек. например)?.пробовал такой код:
for (; ; ) { Task.Delay(1000); countDownLabel.Content = String.Format(/*подстановка обновляемого текста*/); }
,но окно виснет.Как решить проблему?


Ответ

Виснет, потому что вы не ожидаете таск: метод 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();

Комментариев нет:

Отправить комментарий