public void Close() { lock (stateLock) { if (state != State.Started) { return; } state = State.Closing; DemonitorTask(receiver); receiver.Stop(); DemonitorTask(receiver); sender.Stop(); socket.Send(BinaryMessage.Make(MSG_CLOSE).Complete()); // HACK: otherwise close message may not be sent Thread.Sleep(TimeSpan.FromMilliseconds(5)); socket.Close(); state = State.Closed; } Dispatcher.Dispatch(new ExitMessage()); }