public void Connect(string host, int port, string username, string password, bool createNewUser) { if (networkClient != null) { Disconnect(); } networkClient = NetworkClient.Connect(host, port); if (createNewUser) { networkClient.WriteMessage(Message.Create(MessageType.CreateUserRequest, new UserInfo() { Username = username, Password = password })); var createUserResponse = networkClient.ReadMessage().GetData <SimpleResponse>(); if (!createUserResponse.Success) { OnConnected(false, createUserResponse.Message); return; } } networkClient.WriteMessage(Message.Create(MessageType.CredentialRequest, new UserInfo() { Username = username, Password = password })); var response = networkClient.ReadMessage().GetData <UserCredentialResponse>(); if (response.IsAuthenticated) { networkClient.UserSession = response.UserSession; Task.Factory.StartNew(() => { StartReading(); // handle disconnecting client if client is in bad state Disconnect(); }, TaskCreationOptions.LongRunning); soundEngine.Record(); OnConnected(true, response.Message); networkClient.WriteMessage(Message.Create(MessageType.GetAllChannelsRequest)); } else { OnConnected(false, response.Message); networkClient.Disconnect(); } }