public void Run() { control.RunThread = Thread.CurrentThread; List <Socket> selectReadSockets = new List <Socket>(); List <Socket> connectSockets, errorSockets; if (control.SupportsConnect) { connectSockets = new List <Socket>(); errorSockets = new List <Socket>(); } else { connectSockets = null; errorSockets = null; } while (true) { // // Perform the select // selectReadSockets.Clear(); control.CopyReadSocketsTo(selectReadSockets); if (connectSockets == null || !control.HasConnectSockets) { if (selectReadSockets.Count == 0) { return; } //Console.WriteLine("[DEBUG] Selecting on 0 connect sockets"); Socket.Select(selectReadSockets, null, null, Int32.MaxValue); } else { connectSockets.Clear(); errorSockets.Clear(); control.CopyConnectSocketsTo(connectSockets); control.CopyConnectSocketsTo(errorSockets); if (selectReadSockets.Count == 0 && connectSockets.Count == 0) { return; } //Console.WriteLine("[DEBUG] Selecting on {0} connect sockets", connectSockets.Count); Socket.Select(selectReadSockets, connectSockets, errorSockets, Int32.MaxValue); control.ConnectionError = true; for (int i = 0; i < errorSockets.Count; i++) { Socket socket = errorSockets[i]; SelectHandler handler = control.TryGetHandler(socket); if (handler != null) { handler(ref control, socket, safeBuffer); } } control.ConnectionError = false; for (int i = 0; i < connectSockets.Count; i++) { Socket socket = connectSockets[i]; // Make sure you don't call the handler twice if (!errorSockets.Contains(socket)) { SelectHandler handler = control.TryGetHandler(socket); if (handler != null) { handler(ref control, socket, safeBuffer); } } } } for (int i = 0; i < selectReadSockets.Count; i++) { Socket socket = selectReadSockets[i]; SelectHandler handler = control.TryGetHandler(socket); if (handler != null) { handler(ref control, socket, safeBuffer); } } } }