コード例 #1
0
ファイル: NetMQActor.cs プロジェクト: newstrading/netmq
        private NetMQActor(PairSocket self, PairSocket shim, IShimHandler shimHandler)
        {
            m_shimHandler = shimHandler;

            m_self = self;
            m_shim = shim;

            EventHandler <NetMQSocketEventArgs> onReceive = (sender, e) =>
                                                            m_receiveEvent.Fire(this, new NetMQActorEventArgs(this));

            EventHandler <NetMQSocketEventArgs> onSend = (sender, e) =>
                                                         m_sendEvent.Fire(this, new NetMQActorEventArgs(this));

            m_receiveEvent = new EventDelegator <NetMQActorEventArgs>(
                () => m_self.ReceiveReady += onReceive,
                () => m_self.ReceiveReady -= onReceive);

            m_sendEvent = new EventDelegator <NetMQActorEventArgs>(
                () => m_self.SendReady += onSend,
                () => m_self.SendReady -= onSend);

            var random = new Random();

            // Bind and connect pipe ends
            string actorName;
            string endPoint;

            while (true)
            {
                try
                {
                    actorName = string.Format("NetMQActor-{0}-{1}", random.Next(0, 10000), random.Next(0, 10000));
                    endPoint  = string.Format("inproc://{0}", actorName);
                    m_self.Bind(endPoint);
                    break;
                }
                catch (AddressAlreadyInUseException)
                {
                    // Loop around and try another random address
                }
            }

            m_shim.Connect(endPoint);

            m_shimThread = new Thread(RunShim)
            {
                Name = actorName
            };
            m_shimThread.Start();

            // Mandatory handshake for new actor so that constructor returns only
            // when actor has also initialised. This eliminates timing issues at
            // application start up.
            m_self.ReceiveSignal();
        }
コード例 #2
0
        /// <summary>
        /// 构造
        /// </summary>
        /// <param name="address"></param>
        /// <param name="shimCreator"></param>
        protected WsSocket(string address, Func <int, string, BaseShimHandler> shimCreator)
        {
            Id = Interlocked.Increment(ref _id);

            _messagesPipe = new PairSocket();
            _messagesPipe.Bind($"inproc://wsrouter-{Id}");
            _messagesPipe.ReceiveReady += OnMessagePipeReceiveReady;
            _actor = NetMQActor.Create(ShimHandler = shimCreator(Id, address));

            _messagesPipe.ReceiveSignal();
        }
コード例 #3
0
ファイル: WSSocket.cs プロジェクト: agebullhu/WebSock-Jsmq
        protected WSSocket(Func <int, IShimHandler> shimCreator)
        {
            int id = Interlocked.Increment(ref s_id);

            m_messagesPipe = new PairSocket();
            m_messagesPipe.Bind(string.Format("inproc://wsrouter-{0}", id));

            m_messagesPipe.ReceiveReady += OnMessagePipeReceiveReady;

            m_actor = NetMQActor.Create(shimCreator(id));

            m_messagesPipe.ReceiveSignal();
        }
コード例 #4
0
        private NetMQActor([NotNull] NetMQContext context, [NotNull] IShimHandler shimHandler)
        {
            m_shimHandler = shimHandler;

            m_self = context.CreatePairSocket();
            m_shim = context.CreatePairSocket();

            EventHandler <NetMQSocketEventArgs> onReceive = (sender, e) =>
                                                            m_receiveEvent.Fire(this, new NetMQActorEventArgs(this));

            EventHandler <NetMQSocketEventArgs> onSend = (sender, e) =>
                                                         m_sendEvent.Fire(this, new NetMQActorEventArgs(this));

            m_receiveEvent = new EventDelegator <NetMQActorEventArgs>(
                () => m_self.ReceiveReady += onReceive,
                () => m_self.ReceiveReady -= onReceive);

            m_sendEvent = new EventDelegator <NetMQActorEventArgs>(
                () => m_self.SendReady += onSend,
                () => m_self.SendReady -= onSend);

            var random = new Random();

            //now binding and connect pipe ends
            string endPoint;

            while (true)
            {
                try
                {
                    endPoint = string.Format("inproc://NetMQActor-{0}-{1}", random.Next(0, 10000), random.Next(0, 10000));
                    m_self.Bind(endPoint);
                    break;
                }
                catch (AddressAlreadyInUseException)
                {
                    // In case address already in use we continue searching for an address
                }
            }

            m_shim.Connect(endPoint);

            m_shimThread = new Thread(RunShim);
            m_shimThread.Start();

            // Mandatory handshake for new actor so that constructor returns only
            // when actor has also initialised. This eliminates timing issues at
            // application start up.
            m_self.ReceiveSignal();
        }
コード例 #5
0
ファイル: NetMQActor.cs プロジェクト: newstrading/netmq
        /// <summary>
        /// Release any contained resources.
        /// </summary>
        /// <param name="disposing">true if managed resources are to be released</param>
        protected virtual void Dispose(bool disposing)
        {
            if (!disposing)
            {
                return;
            }

            // send destroy message to pipe
            if (m_self.TrySendFrame(EndShimMessage))
            {
                m_self.ReceiveSignal();
            }

            m_shimThread.Join();
            m_self.Dispose();
            m_sendEvent.Dispose();
            m_receiveEvent.Dispose();
        }
コード例 #6
0
ファイル: NetMQActor.cs プロジェクト: tobiasb/netmq
        /// <summary>
        /// Release any contained resources.
        /// </summary>
        /// <param name="disposing">true if managed resources are to be released</param>
        protected virtual void Dispose(bool disposing)
        {
            if (!disposing)
            {
                return;
            }

            // send destroy message to pipe
            m_self.Options.SendTimeout = TimeSpan.Zero;
            try
            {
                m_self.Send(EndShimMessage);
                m_self.ReceiveSignal();
            }
            catch (AgainException)
            {}

            m_shimThread.Join();
            m_self.Dispose();
        }
コード例 #7
0
        /// <summary>
        /// Release any contained resources.
        /// </summary>
        /// <param name="disposing">true if managed resources are to be released</param>
        protected virtual void Dispose(bool disposing)
        {
            if (Interlocked.CompareExchange(ref m_isDisposed, 1, 0) != 0)
            {
                return;
            }
            if (!disposing)
            {
                return;
            }

            // send destroy message to pipe
            if (m_self.TrySendFrame(EndShimMessage))
            {
                m_self.ReceiveSignal();
            }

            m_shimThread.Join();
            m_self.Dispose();
            m_sendEvent.Dispose();
            m_receiveEvent.Dispose();
        }