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)); }
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); } }