private void WriteMessageWorker() { while (true) { _writerThreadReady.Set(); _writerThreadWrite.WaitOne(); // Are we shutting down? if (_stopEvent.WaitOne(0, false)) { return; } try { if (_socket == null) { throw new InvalidOperationException("No server connection has been established."); } string id = "N/A"; if (_writerEventArgs.MessageToSend is IMqttIdMessage) { id = ((IMqttIdMessage)_writerEventArgs.MessageToSend).MessageId.ToString(); } byte[] sendBuffer = _writerEventArgs.MessageToSend.Serialize(); _logger.LogMessage("Socket", LogLevel.Verbose, "Sending message type " + _writerEventArgs.MessageToSend.MessageType + ", QOS=" + _writerEventArgs.MessageToSend.QualityOfService + ", ID=" + id); GetStream().Send(sendBuffer); } catch (ErrorContextException ex) { string msg = "Error sending message " + _writerEventArgs.MessageToSend.MessageType + ". " + ex.Message; if (ex.InnerException != null) { msg += ". Inner exception=" + ex.InnerException; } _logger.LogMessage("Socket", LogLevel.Verbose, msg); _writerEventArgs.AdditionalErrorInfo = ex.Message; _writerEventArgs.SocketException = ex.InnerException ?? ex; } catch (Exception ex) { string msg = "Error sending message " + _writerEventArgs.MessageToSend.MessageType + ". " + ex.Message; if (ex.InnerException != null) { msg += ". Inner exception=" + ex.InnerException; } _logger.LogMessage("Socket", LogLevel.Verbose, msg); _writerEventArgs.SocketException = ex; } finally { // If disconnecting, get off the writer thread so we can close it and join to it properly var args = _writerEventArgs.Clone(); if (_writerEventArgs.MessageToSend.MessageType == MessageType.Disconnect) { FireOnCompletedNewThread(args.Clone()); } else { args.Complete(); } } } }