Ссылка Асинхронное / ожидание - Лучшие практики асинхронного программирования
Используя async void
, вы лишаете свой код возможности перехватывать и обрабатывать любые исключения, которые могут быть вызваны вызовомтаймера.Поэтому избегайте использования async void
ни с чем, кроме обработчиков событий.
OnStart
однако не является обработчиком событий.Просто обычный метод, который согласно документации ...
Разработчики приложения переопределяют этот метод для выполнения действий при запуске приложения.
В качестве обходного пути вы можете создать свойсобственные пользовательские события и обработчики, которые позволят выполнить async void
в вашем обработчике событий.Вы подпишетесь на событие, когда приложение вызовет OnStart
, а затем вызовет пользовательское событие, которое будет обрабатываться асинхронно.
StartTimer
не является тяжелым методом, поэтому на самом деле не гарантирует его асинхронного вызова.Однако PointChecker.CheckPoints()
синхронно вызывается для вашей базы данных.
Этот метод запускает обновление для моей базы данных синхронно с db2.Execute("UPDATE ..... etc");
Это может, однако, привести кблокировка, которая может влиять на производительность каждый раз, когда она вызывается.Это должен быть тот, который включен в асинхронный вызов или рефакторинг, чтобы быть нативным асинхронным методом.
//...
protected override void OnStart() {
PointsChecking += OnPointsChecking; //subscribe to event
StartTimer(); //start the timer as normal.
}
private event EventArgs PointsChecking = delegate { };
private async void OnPointsChecking(object sender, EventArgs args) {
//asynchronously check points without blocking main thread
await Task.Run(() => {
PointChecker.CheckPoints();
stopWatch.Restart();
});
}
public void StartTimer() {
if (!stopWatch.IsRunning)
stopWatch.Start();
Device.StartTimer(new TimeSpan(0, 0, 1), () => {
if (stopWatch.IsRunning && stopWatch.Elapsed.Minutes >= 1) {
PointsChecking(null, EventArgs.Empty); //invoked event
}
return true;
});
}
//...
Таймер будет отвечать за выдачу события для обработки повторной операции.Делая обработчик событий асинхронным, вы избегаете блокировки основного потока и получаете дополнительное преимущество, заключающееся в возможности перехвата и обработки любых исключений, вызванных вызванной операцией базы данных, если это необходимо.