Вы можете использовать асинхронный цикл. Хотя это выглядит как бесконечный цикл, на самом деле это не так. Из-за ожидания Задачи задержки этот метод периодически возвращает управление вызывающей стороне. Если бы это был не асинхронный метод с допустимой асинхронной операцией, это был бы синхронный метод, и при его вызове пользователь мог заблокировать пользовательский интерфейс.
Но поскольку это не так, он работает по мере необходимости и дает вам четкое представление о том, что должен делать код, а также поддерживает нас в потоке пользовательского интерфейса все время (магия ожидания!), Поэтому мы не имеет многопоточных проблем или нескольких делегатов / обратных вызовов.
private async Task DoAddAsync()
{
while (true)
{
// do the work in the loop
// ....
// don't run again for at least 200 milliseconds
await Task.Delay(200);
}
}
Реальная хитрость в том, чтобы сделать эту работу, заключается не в методе DoAddAsync. Это как мы это называем. Вы не ждете звонка.
private async void Window_Loaded(object sender, RoutedEventArgs e)
{
DoAddAsync()
}
Вы также можете обновить свой путь, но он вводит несколько делегатов, потенциальные сложности многопоточности в зависимости от выполняемой работы, и нам все еще нужно вернуться в поток пользовательского интерфейса для обновления пользовательского интерфейса.
private async void Window_Loaded(object sender, RoutedEventArgs e)
{
await Task.Run(async () =>
{
while (true)
{
// do the work in the loop
// update the UI on the UI thread
Dispatcher.Invoke(() => // do some );
// don't run again for at least 200 milliseconds
await Task.Delay(200);
}
});
}