DispatcherTimer вызывает программу "Заикание"
У меня есть DispatcherTimer
в моем приложении WPF, которое обновляет текст в приложении каждые 200 миллисекунд. Программа отображает серию счетчиков, часов и таймеров.
private DispatcherTimer dispatch = new DispatcherTimer();
public Timer()
{
InitializeComponent();
this.dispatch.Interval = TimeSpan.FromMilliseconds(200);
this.dispatch.Tick += new EventHandler(updateTimer);
}
private void updateTimer(object sender, EventArgs e)
{
loadingImage.RenderTransform = new RotateTransform(counter * 36);
counter++;
try
{
clock.Text = DateTime.Now.ToString(@clockFormat.Text);
}
catch (Exception) { }
try
{
watch.Text = watchCounter.Elapsed.ToString(@watchFormat.Text);
}
catch (Exception) { }
}
Проблема, которую я имею, когда DispatcherTimer
работает, это вызывает "заикание" в моем приложении. Как будто каждый раз, когда он запускает обработчик событий, программа немного отстает. Есть ли способ избавиться от этого отставания?
2 ответа
Таймер не вызывает задержку. Ваш код делает. Вы создаете нагрузку рендеринга в потоке пользовательского интерфейса. Оптимизируйте рисование так, чтобы анимируемый элемент быстро перерисовывался.
Также лучше использовать анимацию вместо таймера.
Также обратите внимание, что таймеры могут искажаться во времени. Инкрементные вычисления, такие как счетчик счетчиков, по своей природе нестабильны. Запишите, когда ваше приложение запустится, и вычислите значение счетчика за прошедшее время.
Быстрый поиск указывает на RotateTransform в качестве возможного виновника. См. Этот ответ /questions/32914930/nizkaya-proizvoditelnost-odnovremennyih-operatsij-graphicsrotatetransform/32914940#32914940 где упоминается блокировка на уровне процесса. Там также есть некоторые ответы, которые могут работать для вас.