private void Work() { using (var subscriberSocket = new SubscriberSocket()) { subscriberSocket.Options.ReceiveHighWatermark = 1000; subscriberSocket.SubscribeToAnyTopic(); subscriberSocket.Connect(_toPublisherEndpoint); using (var publisherSocket = new XPublisherSocket()) { publisherSocket.Options.XPubVerbose = true; publisherSocket.Bind(_toSubscribersEndpoint); using (_poller = new NetMQPoller { new NetMQTimer(TimeSpan.FromMilliseconds(1)), subscriberSocket, publisherSocket }) { subscriberSocket.ReceiveReady += (s, e) => { var message = e.Socket.ReceiveMultipartBytes(); var topic = Encoding.UTF8.GetString(message[0]); var payload = message[1]; _cache[topic] = payload; publisherSocket.SendMultipartBytes(message); }; publisherSocket.ReceiveReady += (s, e) => { var message = e.Socket.ReceiveFrameBytes(); var isSub = message[0] == 1; var topic = Encoding.UTF8.GetString(message.Skip(1).ToArray()); if (_cache.ContainsKey(topic)) { publisherSocket.SendMoreFrame(Encoding.UTF8.GetBytes(topic)).SendFrame(_cache[topic]); } }; _poller.Run(); } } } }