Beispiel #1
0
        private Task <string> HandlePubResponse(short packetId)
        {
            PendingPublishMessage pendingMessage = DequeueMessage <PendingPublishMessage>(packetId);
            string result = pendingMessage == null ? null : ((PendingPublishMessage)pendingMessage).MessageId;

            return(Util.RunSynchronously <string>(() => result));
        }
Beispiel #2
0
        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));
            }
        }