public void TestReceiverCleanup()
        {
            // Create sender and receiver
            var sender = new SenderViewModel();
            var receiver = new ReceiverViewModel();

            // Register receiver to get messages
            receiver.Subscribe(MessageTokens.Test + "_TestReceiverCleanup");

            // Set message content
            sender.SentMessage = "hello";

            // Listen for response
            var wait = new AutoResetEvent(false);
            receiver.SimpleMessageReceived += (o, args) => wait.Set();

            // Send message
            sender.SendSimpleMessageAsync(MessageTokens.Test + "_TestReceiverCleanup");

            // Wait for response
            if (!wait.WaitOne(TimeSpan.FromSeconds(15)))
                Assert.Fail("Message not received in timeout");

            // Assert message was received
            Assert.AreEqual<string>(sender.SentMessage, receiver.ReceivedMessage);

            // Try to GC reciever
            var weakReceiver = new WeakReference(receiver);
            receiver = null;
            GC.Collect();
            #if NETFX_CORE
            Task.Delay(1000).Wait();
            #else
            Thread.Sleep(1000);
            #endif

            // Assert the receiver was allowed to be GC'd
            Assert.IsFalse(weakReceiver.IsAlive, "Receiver has not been GC'd");

            // Send another message
            sender.SentMessage = "hello again";
            sender.SendSimpleMessage(MessageTokens.Test + "_TestReceiverCleanup");

            // Assert the receiver is still not alive
            Assert.IsFalse(weakReceiver.IsAlive, "Receiver has not been GC'd after sending message");
        }
        public void TestSimpleMessage()
        {
            // Create sender and receiver
            var sender = new SenderViewModel();
            var receiver = new ReceiverViewModel();

            // Register receiver to get messages
            receiver.Subscribe(MessageTokens.Test + "_TestSimpleMessage");

            // Set message content
            sender.SentMessage = "hello";

            // Capture orig values
            int origReceiverData = receiver.ReceivedData;
            bool origSenderData = sender.ReceivedData;

            // Listen for response
            var wait = new AutoResetEvent(false);
            receiver.SimpleMessageReceived += (o, args) => wait.Set();

            // Send message
            sender.SendSimpleMessageAsync(MessageTokens.Test + "_TestSimpleMessage");

            // Wait for response
            if (!wait.WaitOne(TimeSpan.FromSeconds(15)))
                Assert.Fail("Message not received in timeout");

            // Unregister to receive messages
            receiver.Unsubscribe(MessageTokens.Test + "_TestSimpleMessage");

            // Assert message was received
            Assert.AreEqual<string>(sender.SentMessage, receiver.ReceivedMessage);

            // Assert receiver and sender data have not changed
            Assert.AreEqual<int>(origReceiverData, receiver.ReceivedData);
            Assert.AreEqual<bool>(origSenderData, sender.ReceivedData);
        }