private void EndConnectImpl(IAsyncResult ar, ConnectionMultiplexer multiplexer, TextWriter log, Tuple<Socket, ISocketCallback> tuple) { try { bool ignoreConnect = false; ShouldIgnoreConnect(tuple.Item2, ref ignoreConnect); if (ignoreConnect) return; var socket = tuple.Item1; var callback = tuple.Item2; #if CORE_CLR multiplexer.Wait((Task)ar); // make it explode if invalid (note: already complete at this point) #else socket.EndConnect(ar); #endif var netStream = new NetworkStream(socket, false); var socketMode = callback == null ? SocketMode.Abort : callback.Connected(netStream, log); switch (socketMode) { case SocketMode.Poll: multiplexer.LogLocked(log, "Starting poll"); OnAddRead(socket, callback); break; case SocketMode.Async: multiplexer.LogLocked(log, "Starting read"); try { callback.StartReading(); } catch (Exception ex) { ConnectionMultiplexer.TraceWithoutContext(ex.Message); Shutdown(socket); } break; default: ConnectionMultiplexer.TraceWithoutContext("Aborting socket"); Shutdown(socket); break; } } catch (ObjectDisposedException) { multiplexer.LogLocked(log, "(socket shutdown)"); if (tuple != null) { try { tuple.Item2.Error(); } catch (Exception inner) { ConnectionMultiplexer.TraceWithoutContext(inner.Message); } } } catch(Exception outer) { ConnectionMultiplexer.TraceWithoutContext(outer.Message); if (tuple != null) { try { tuple.Item2.Error(); } catch (Exception inner) { ConnectionMultiplexer.TraceWithoutContext(inner.Message); } } } }