public async Task CanPublishAndReceiveMultipleMessagesOnChannel()
        {
            var expected = "CanPublishAndReceiveOnChannel";

            using (var socketConnection = new SocketConnection(TestsSetup.Host, TestsSetup.Port, Scheduler.Immediate))
            {
                using (var publisherConnection = new SocketConnection(TestsSetup.Host, TestsSetup.Port, Scheduler.Immediate))
                {
                    var subscriber = socketConnection.AsSubscriber();
                    var publisher = publisherConnection.AsPublisher();
                    var matchedReplies = 0;
                    var tcs = new TaskCompletionSource<bool>();
                    var expectedMessagesCount = 512;

                    var messagesChannel = await subscriber.Subscribe("channel1");
                    messagesChannel.Subscribe(message =>
                    {
                        if (string.Compare(message.Content, expected, StringComparison.InvariantCultureIgnoreCase) == 0)
                            matchedReplies += 1;

                        if (matchedReplies == expectedMessagesCount)
                            tcs.SetResult(true);
                    });

                    foreach (var once in Enumerable.Repeat(Unit.Default, expectedMessagesCount))
                    {
                        var result = await publisher.PublishMessage("channel1", expected);
                    }

                    await Task.WhenAny(Task.Delay(1000), tcs.Task);
                    Assert.AreEqual(expectedMessagesCount, matchedReplies);
                }
            }
        }
        async void Subscribe()
        {
            var connection = new SocketConnection("127.0.0.1", 4525, Scheduler.Immediate);
            var currentSyncronizationContext = SynchronizationContext.Current;
            var subscriber = connection.AsSubscriber();

            try
            {
                var channelMessagesReceived = 0;
                var channelsSubscription = await subscriber.Subscribe("alert1");
                channelsSubscription
                    .Buffer(TimeSpan.FromSeconds(1))
                    .ObserveOn(currentSyncronizationContext)
                    .Subscribe(messages =>
                    {
                        channelMessagesReceived += messages.Count;
                        channelMessages.Text = channelMessagesReceived.ToString();
                        //listBoxAlerts.Items.Add(new ListBoxItem { Content = message.ChannelName + ":" + message.Content });
                    },
                    ex =>
                    {
                        MessageBox.Show(ex.ToString());
                    });

                var patternChannelMessagesReceived = 0;
                var channelsPatternSubscription = await subscriber.PSubscribe("alert*");
                channelsPatternSubscription
                    .Buffer(TimeSpan.FromSeconds(1))
                    .ObserveOn(currentSyncronizationContext)
                    .Subscribe(messages =>
                    {
                        patternChannelMessagesReceived += messages.Count;
                        channelPatternMessages.Text = patternChannelMessagesReceived.ToString();
                        //listBoxAlerts.Items.Add(new ListBoxItem { Content = message.Pattern + ":" + message.Content });
                    },
                    ex =>
                    {
                        MessageBox.Show(ex.ToString());
                    });
            }
            catch (AggregateException ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }
        public async Task CanPublishAndReceiveOnChannel()
        {
            var expected = "CanPublishAndReceiveOnChannel";

            using (var socketConnection = new SocketConnection(TestsSetup.Host, TestsSetup.Port, Scheduler.Immediate))
            {
                using (var publisherConnection = new SocketConnection(TestsSetup.Host, TestsSetup.Port, Scheduler.Immediate))
                {
                    var subscriber = socketConnection.AsSubscriber();
                    var publisher = publisherConnection.AsPublisher();

                    var messagesChannel = await subscriber.Subscribe("channel1");
                    var replaySubject = new ReplaySubject<string>();
                    messagesChannel.Take(1).Select(x => x.Content).Subscribe(replaySubject);

                    await publisher.PublishMessage("channel1", expected);
                    var result = await replaySubject.FirstAsync();

                    Assert.AreEqual(expected, result); 
                }
            }
        }
        public async Task ChannelsObservablesDontThrowExceptionWhenSocketConnectionIsDisposed()
        {
            var subscriptionCompleted = new TaskCompletionSource<bool>();

            using (var socketConnection = new SocketConnection(TestsSetup.Host, TestsSetup.Port, Scheduler.Immediate))
            {
                var subscriber = socketConnection.AsSubscriber();

                var channelPatternMessages = await subscriber.PSubscribe("channel*");

                channelPatternMessages.Subscribe(
                    _ => { }, 
                    ex => {
                        subscriptionCompleted.SetException(ex);
                    },
                    () => { subscriptionCompleted.SetResult(true); });
            }

            try
            {
                var completed = await subscriptionCompleted.Task;
                Assert.IsTrue(completed);
            }
            catch (AggregateException ex)
            {
                if (ex.InnerException is RedisException)
                {
                    throw new Exception(((RedisException)ex.InnerException).SocketError.ToString());
                }

                throw ex.InnerException;
            }
        }