private async Task RunAnnounceLoopAsync() {
         await TaskEx.YieldToThreadPool();

         var announce = new AnnouncementDto { Identity = identity };

         while (!shutdownCancellationToken.IsCancellationRequested) {
            try {
               await payloadSender.BroadcastAsync(announce).ConfigureAwait(false);
               await Task.Delay(kAnnounceIntervalMillis, shutdownCancellationToken).ConfigureAwait(false);
            } catch (OperationCanceledException) {
               // shutdown cancellation token cancelled
            }
         }
      }
      private void HandleAnnouncement(UdpClientRemoteInfo remoteInfo, AnnouncementDto x) {
         announcementsReceivedCounter.Increment();

         var peerIdentity = x.Identity;
         var peerId = peerIdentity.Id;
         bool isNewlyDiscoveredRoute = false;
         RoutingContext addedRoutingContext = null;
         UdpUnicaster addedUnicaster = null;
         var routingContext = routingContextsByPeerId.GetOrAdd(
            peerId,
            add => {
               isNewlyDiscoveredRoute = true;
               var unicastReceivePort = int.Parse((string)x.Identity.Properties[UdpConstants.kUnicastPortIdentityPropertyKey]);
               var unicastIpAddress = remoteInfo.IPEndpoint.Address;
               var unicastEndpoint = new IPEndPoint(unicastIpAddress, unicastReceivePort);
               var unicastRemoteInfo = new UdpClientRemoteInfo {
                  Socket = remoteInfo.Socket,
                  IPEndpoint = unicastEndpoint
               };

               addedUnicaster = udpUnicasterFactory.Create(unicastRemoteInfo);
               return addedRoutingContext = new RoutingContext(addedUnicaster);
            });
         if (addedRoutingContext == routingContext) {
            addedUnicaster.Initialize();
         }
         if (isNewlyDiscoveredRoute) {
            routingTable.Register(peerId, routingContext);
         }

         peerTable.GetOrAdd(peerId).HandleInboundPeerIdentityUpdate(peerIdentity);
      }