public void Loop() { while (!m_stopping) { if (m_new) { foreach (PollSet pollSet in m_tempFDs) { m_fds.Add(pollSet); } m_tempFDs.Clear(); m_new = false; } // Execute any due timers. int timeout = ExecuteTimers(); Array.Copy(m_sourceSetIn, 1, m_readFDs, 1, m_readCount); Array.Copy(m_sourceSetOut, 1, m_writeFDs, 1, m_writeCount); Array.Copy(m_sourceSetError, 1, m_errorFDs, 1, m_errorCount); m_readFDs[0] = (IntPtr)m_readCount; m_writeFDs[0] = (IntPtr)m_writeCount; m_errorFDs[0] = (IntPtr)m_errorCount; NativeMethods.TimeValue tv = new NativeMethods.TimeValue(timeout / 1000, timeout % 1000 * 1000); int rc; if (timeout != 0) { rc = NativeMethods.@select(0, m_readFDs, m_writeFDs, m_errorFDs, ref tv); } else { rc = NativeMethods.@select(0, m_readFDs, m_writeFDs, m_errorFDs, IntPtr.Zero); } if (rc == -1) { throw new SocketException(); } // Debug.Assert(rc != -1); if (rc == 0) { continue; } foreach (var item in m_fds) { if (item.Cancelled) { continue; } if (FDIsSet(item.Socket, m_errorFDs)) { item.Handler.InEvent(); } if (item.Cancelled) { continue; } if (FDIsSet(item.Socket, m_writeFDs)) { item.Handler.OutEvent(); } if (item.Cancelled) { continue; } if (FDIsSet(item.Socket, m_readFDs)) { item.Handler.InEvent(); } } if (m_retired) { foreach (var item in m_fds.Where(k => k.Cancelled).ToList()) { m_fds.Remove(item); } foreach (var item in m_tempFDs.Where(k => k.Cancelled).ToList()) { m_tempFDs.Remove(item); } m_retired = false; } } }