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(); }
/// <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(); }
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(); }
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(); }
/// <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(); }
/// <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(); }
/// <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(); }