3

Как обновлять текст в Label`е с определенной частотой(1 сек. например)?.пробовал такой код:

     for (; ; )
        {
            Task.Delay(1000);
            countDownLabel.Content =
                String.Format(/*подстановка обновляемого текста*/);
        }

,но окно виснет.Как решить проблему?

david_I
  • 1,003
  • Почему бы не использовать таймер (System.Windows.Forms.Timer, System.Threading.Timer, System.Timers.Timer)? – Dmitry D. Dec 07 '15 at 16:24

1 Answers1

4

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