public void SendMessageAsync(IMqttMessage msg, object eventData, string clientUid) { Logger.LogMessage("Protocol", LogLevel.Verbose, "SendMessageAsync(" + msg.MessageType + ")"); var args = new SocketEventArgs { MessageToSend = msg, ClientUid = clientUid }; // If we expect a response, push the event data on our stack and retrieve it with the response if (args.MessageToSend.ExpectedResponse != MessageType.None) { _messageStore.Add(args.MessageToSend, eventData, clientUid); } args.OnOperationComplete((eventArgs) => { MessageType messageType = eventArgs.MessageToSend.MessageType; string exceptionText = eventArgs.SocketException == null ? "Success." : "Error: " + eventArgs.SocketException.ToString(); Logger.LogMessage("Protocol", LogLevel.Verbose, "SendMessageAsync(" + messageType + ") completed callback. " + exceptionText); if (eventArgs.SocketException != null) { // Clean up pending message queue _messageStore.Remove(args.MessageToSend.ExpectedResponse, MqttMessageBase.GetMessageIdOrDefault(args.MessageToSend), clientUid); } OnSendMessageAsyncCompleted(clientUid, eventArgs.MessageToSend, eventArgs.SocketException); if (messageType == MessageType.Connect && eventArgs.SocketException != null) { FireConnectComplete(new MqttNetEventArgs { Message = args.MessageToSend, Exception = eventArgs.SocketException, AdditionalErrorInfo = eventArgs.AdditionalErrorInfo, EventData = eventData, ClientUid = clientUid }); } else if (messageType == MessageType.Disconnect) { CloseConnection(clientUid); FireSendMessageComplete(new MqttNetEventArgs { Message = args.MessageToSend, Exception = eventArgs.SocketException, AdditionalErrorInfo = eventArgs.AdditionalErrorInfo, EventData = eventData, ClientUid = clientUid }); } else if (messageType == MessageType.Subscribe && eventArgs.SocketException != null) { FireSubscribeMessageComplete(new MqttNetEventArgs { Message = args.MessageToSend, Exception = eventArgs.SocketException, AdditionalErrorInfo = eventArgs.AdditionalErrorInfo, EventData = eventData, ClientUid = clientUid }); } else if (args.MessageToSend.ExpectedResponse == MessageType.None || eventArgs.SocketException != null) { FireSendMessageComplete(new MqttNetEventArgs { Message = args.MessageToSend, Exception = eventArgs.SocketException, AdditionalErrorInfo = eventArgs.AdditionalErrorInfo, EventData = eventData, ClientUid = clientUid }); } }); Socket.WriteAsync(args); }