private void ScanThreadProc() { lock (m_syncRoot) { Debug.WriteLine("+WiFiService.ScanThreadProc"); Scanning = true; do { if (m_wzc == null) { break; } if (!WiFiEnabled) { break; } try { var et = Environment.TickCount; if (m_currentAPs == null) { m_currentAPs = m_wzc.NearbyAccessPoints; } else { m_currentAPs.Refresh(); } if (!WiFiEnabled) { break; } var added = m_currentAPs.Except(m_knownAPs); var lost = m_knownAPs.Except(m_currentAPs); var updated = m_knownAPs.Intersect(m_currentAPs); m_knownAPs = m_currentAPs.ToList(); RaisePropertyChanged("KnownAPs"); var handler = ScanComplete; et = Environment.TickCount - et; Debug.WriteLine(string.Format("Network scan took {0}ms", et)); if (!WiFiEnabled) { break; } if (handler != null) { ThreadPool.QueueUserWorkItem(delegate { handler(added.ToArray(), lost.ToArray(), updated.ToArray()); }); } } catch (Exception ex) { Debug.WriteLine(string.Format("Exception in WiFi network scan. If you disabled the adapter, you can ignore this error: ", ex.Message)); // if we disable the WiFi adapter while this loop is executing, bad things can happen // it's better to just catch around the whole thing and ignore if (!WiFiEnabled) { break; } } } while (!m_stopScanEvent.WaitOne(ScanPeriod, false)); Debug.WriteLine("-WiFiService.ScanThreadProc"); Scanning = false; m_currentAPs = null; } }