public bool connect(JsonObject user, Action <JsonObject> handshakeCallback) { ManualResetEvent timeoutEvent = new ManualResetEvent(false); try { protocol.start(user, (JsonObject json) => { timeoutEvent.Set(); try { if (handshakeCallback != null) { handshakeCallback(json); } } catch (SocketException e) { if (netWorkState != NetWorkState.DISCONNECTED && netWorkState != NetWorkState.TIMEOUT && netWorkState != NetWorkState.ERROR && netWorkState != NetWorkState.KICK) { error(); } } }); timeoutEvent.WaitOne(timeoutMSec, false); if (!protocol.isWaking()) { timeout(); } return(true); } catch (Exception e) { Trace.TraceInformation(e.ToString()); } timeoutEvent.Close(); timeoutEvent = null; error(); return(false); }