private Task <string> HandlePubResponse(short packetId) { PendingPublishMessage pendingMessage = DequeueMessage <PendingPublishMessage>(packetId); string result = pendingMessage == null ? null : ((PendingPublishMessage)pendingMessage).MessageId; return(Util.RunSynchronously <string>(() => result)); }
void IMqttSession.Publish(string messageId, MqttQos qos) { var publish = new PendingPublishMessage(1, messageId, qos); //WARNING: Something you may not expect //SetResult will transfer control to a waiter if there is one. We need to get our queue straight before that happens //Or else whack shit goes wrong. So don't go thinking "it's prettier to see if the queue is empty before queueing". //Not that this was ever coded that way or anything... pendingMessages.Enqueue(publish); //If this is the first message, signal. if (pendingMessages.Count == 1 && pendingMessageCompletionSource != null) { TaskCompletionSource <PendingMessage> source = pendingMessageCompletionSource; pendingMessageCompletionSource = null; source.SetResult(publish); } if (qos == MqttQos.BestEffort) { pendingMessages.Enqueue(new PendingPubRelMessage(1)); } }