Как обновлять текст в 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();
Комментариев нет:
Отправить комментарий