protected override void Execute() { var peer = _peer; var networkStream = peer.NetworkStream; var networkType = peer.NetworkType; var sharedSecretBytes = peer.SharedSecretBytes; var packetsToSend = peer._packetsToSend; var cancellationToken = _cancellationToken; while (!cancellationToken.IsCancellationRequested) { try { using var pingTimeout = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken); pingTimeout.CancelAfter(Thread.VolatileRead(ref peer.KeepAliveDuration)); var packetToSend = packetsToSend.Take(pingTimeout.Token); packetToSend.WriteDelimitedTo(_peer.NetworkStream); } catch (OperationCanceledException ex) { if (ex.CancellationToken == cancellationToken) { return; } // Timeout caused by ping duration. var packet = PacketUtility.SerializePacket(new PingPacket(), networkType, sharedSecretBytes); packet.WriteDelimitedTo(networkStream); } catch (IOException) { // Either the network has closed or write timeout has been triggered due to no response from the client. // TODO: Disconnect peer. } } }