Когда вы делаете async
/ await
, вы в основном хотите, чтобы все (большинство) ваших методов работали в режиме async
/ await
. На данный момент ваши смешанные асинхронные и не асинхронные вызовы методов. Это называется блокировкой в контексте async
, и его следует избегать , не в последнюю очередь из-за того, что это может привести к тупикам. Я хотел бы предложить вам прочитать хотя бы Async / Await - Лучшие практики в асинхронном программировании
В общем (и, чтобы несколько упростить задачу) все ваши методы должны иметь сигнатуру
public async Task method()
{
}
и все ваши методы должны быть вызваны:
await method();
Вот пара вещей, которые вы делаете неправильно
private async void startDistanceMonitoring()
Никогда не использовать async void
(это только для асинхронных обработчиков событий)
private void Sleep(int NoOfMs)
{
Task.Delay(NoOfMs).Wait();
}
это блокировка, это должно быть
private async Task Sleep(int NoOfMs)
{
await Task.Delay(NoOfMs);
}
При звонке:
startDistanceMonitoring();
startDistanceMonitoring
- это метод async
, но вы его не ожидаете. Так что ваша программа может очень хорошо завершиться, прежде чем она будет завершена. Это должно быть:
await startDistanceMonitoring();
Вы делаете это неправильно во всем этом блоке кода. Всегда вызывать async
методы с await
.
Ваш метод ввода не async
, public void Run(IBackgroundTaskInstance taskInstance)
должен быть public async Task Run(IBackgroundTaskInstance taskInstance)