/*public void Subscribe(string channel, Action<RedisChannel, RedisValue> handler)
         * {
         *  sub.Subscribe(channel, handler);
         * }
         *
         * public void Publish(string channel, string message)
         * {
         *  sub.Publish(channel, message);
         * }*/

        public void StartPriceSubscriber(string ip, int port = 6379) //string symbol)
        {
            m_redisSub = ConnectRedis(ip, port);
            m_sub      = m_redisSub.GetSubscriber();

            dout("RedisIQFeed::SubscribePriceUpdates()");
            m_sub.SubscribeAsync(IQ_CHANNEL, (channel, message) => {
                OnSubscriberReceive?.Invoke((string)message);
            });
        }
        public void SubscriptionLoop(int threadSleepMilliseconds = 50)
        {
            while (true)
            {
                // ZeroMQ
                using (var replyFrame = m_subscriberSocket.ReceiveFrame())
                {
                    string reply = replyFrame.ReadString();
                    //Console.WriteLine(reply);
                    OnSubscriberReceive?.Invoke(reply);
                }

                //Msg replyMsg = new Msg();                           // NetMQ
                //m_subscriber.Receive(ref replyMsg);
                //string reply = replyMsg.ToString();
                ////string reply = replyFrame.ReadString();
                ////Console.WriteLine(reply);
                //UpdateSubscriberReceive?.Invoke(reply);

                Thread.Sleep(threadSleepMilliseconds);
            }
        }