2

マルチスレッドアプリケーションを構築しています。スレッドの1つは、外部のハードウェアから送信されるUDPメッセージの処理を担当します。現在、ループでUdpClient.Receiveメソッドを使用しています。Receiveメソッドは、次のメッセージを待っている間、スレッドをブロックすると思います。すべてのスレッドをシャットダウンしてアプリケーションを正常に停止する場合に使用する共有変数(_isCancelled)があります。ただし、このReceiveメソッドはブロックするため、外部ハードウェアとの通信が失われた場合、アプリケーションを正常にシャットダウンできません。これが現在のコードループです

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

代わりに非同期のReceiveメソッドを使用する必要があると考えています。しかし、それらがどのように機能し、コードをどのように構造化する必要があるかを完全には理解していません。継続的にデータを受信して​​処理できるようにしたいと思います。そして、いつでも_isCancelledをtrueに設定することで、スレッドを正常にシャットダウンできるようにしたいと思います。また、何らかの理由で外部ハードウェアとの通信が失われたり、メッセージを受信しなくなったりした場合でも、スレッドを正常にシャットダウンできるはずです。

4

3 に答える 3