private void DetachFromEngine() { if (m_engine != null) { Thread.Sleep(500); m_engine.OnMessage -= new MessageEventHandler(OnMessage); m_engine.OnCommand -= new CommandEventHandler(OnCommand); m_engine.OnNoise -= new NoiseEventHandler(OnNoise); try { m_engine.Dispose(); } catch { // Depending on when we get called, stopping the engine // throws anything from NullReferenceException, ArgumentNullException, IOException, etc. } m_engine = null; if (m_emulatorProcess != null && !m_emulatorProcess.WaitForExit(4000)) { if (m_emulatorProcess != null && !m_emulatorProcess.HasExited) { m_emulatorProcess.Kill(); m_emulatorProcess = null; } foreach (Process p in Process.GetProcessesByName("Microsoft.SPOT.Emulator.Sample.SampleEmulator")) { p.Kill(); } } GC.Collect(); } /// /// Make sure process exit thread dies /// if (m_waitForProc != null && m_waitForProc.IsAlive) { try { if (!m_waitForProc.Join(1000)) { m_waitForProc.Abort(); } } catch { } } }