Как использовать асинхронный прием для UdpClient в цикле?

Я строю многопоточное приложение. Один из потоков отвечает за обработку UDP-сообщений, поступающих от внешнего устройства. В настоящее время я использую метод UdpClient.Receive в цикле. Я считаю, что метод Receive блокирует поток в ожидании следующего сообщения. У меня есть общая переменная (_isCancelled), которую я использую, если хочу закрыть все потоки и корректно остановить приложение. Однако, потому что этот метод получения блоков я могу• Изящно завершите работу приложения, если связь с внешним компонентом была потеряна. Вот текущий цикл кода

UdpClient _client = new UdpClient(8000);
IPEndPoint _endPoint = new IPEndPoint(IPAddress.Any, 8000);
while (!_isCancelled)
{
  byte[] _bytes = _client.Receive(ref _endPoint);
  ...process data...
}

Я думаю, что вместо этого я должен использовать асинхронные методы получения. Но я не совсем уверен, что понимаю, как это работает и как я должен структурировать свой код. Я хочу иметь возможность непрерывно получать данные и обрабатывать их. И в любое время я хочу иметь возможность корректно закрыть поток, установив для _isCancelled значение true. И если по какой-то причине мы теряем связь с внешним оборудованием или неЧтобы больше не получать сообщений, мы все равно должны иметь возможность корректно закрыть поток.

Ответы на вопрос(3)

Ваш ответ на вопрос