Beispiel #1
0
        public async Task DiscoverAllAsync()
        {
            if (IsDiscovering) // only called from the Mainthread -> not racy
            {
                return;
            }

            IsDiscovering            = true;
            m_bRemoteMinVersionError = false;
            m_bLocalMinVersionError  = false;

            m_wbFirstResult = new WriteOnceBlock <DiscoveredServerInfo>((x) => { return(x); }); // no cloning needed
            BinaryWriter reqPacket = DiscoveryPacket_Request.WritePacket();
            List <DiscoveredServerInfo> liResults = new List <DiscoveredServerInfo>();

            await Task.WhenAll(DiscoverAllIPv4Async(reqPacket, liResults)
                               , DiscoverAllIPv6Async(reqPacket, liResults));

            Log.d(TAG, "Done waiting, got " + liResults.Count + " valid replies");
            if (liResults.Count > 0)
            {
                m_wbFirstResult.Post(liResults[0]); // In case we didn't post any first result because the defaultserver wasn't found
            }
            // Remove Servers which were found on an earlier run but not anymore
            for (int i = FoundServer.Count - 1; i >= 0; i--)
            {
                if (!liResults.Contains(FoundServer[i]))
                {
                    FoundServer.RemoveAt(i);
                }
            }

            IsDiscovering = false;
            DisoveryFinished.Invoke(this, new DiscoveryFinishedEventArgs(m_bRemoteMinVersionError, m_bLocalMinVersionError));
        }
Beispiel #2
0
 private void AddFoundServer(DiscoveredServerInfo server)
 {
     if (!Application.Current.Dispatcher.CheckAccess())
     {
         Application.Current.Dispatcher.Invoke(new Action(() => AddFoundServer(server)));
     }
     if (!FoundServer.Contains(server))
     {
         FoundServer.Add(server);
     }
 }