public Actor(NetMQContext context, IShimHandler <T> shimHandler, T state) { this.m_self = context.CreatePairSocket(); this.m_shim = new Shim <T>(shimHandler, context.CreatePairSocket()); this.m_self.Options.SendHighWatermark = 1000; this.m_self.Options.SendHighWatermark = 1000; this.m_state = state; m_receiveEventDelegatorHelper = new EventDelegatorHelper <NetMQActorEventArgs <T> >(() => m_self.ReceiveReady += OnReceive, () => m_self.ReceiveReady += OnReceive); m_sendEventDelegatorHelper = new EventDelegatorHelper <NetMQActorEventArgs <T> >(() => m_self.SendReady += OnReceive, () => m_self.SendReady += OnSend); //now binding and connect pipe ends string endPoint = string.Empty; while (true) { Action bindAction = () => { endPoint = GetEndPointName(); m_self.Bind(endPoint); }; try { bindAction(); break; } catch (NetMQException nex) { if (nex.ErrorCode == ErrorCode.EFAULT) { bindAction(); } } } m_shim.Pipe.Connect(endPoint); //Initialise the shim handler this.m_shim.Handler.Initialise(state); //Create Shim thread handler CreateShimThread(state); // Mandatory handshake for new actor so that constructor returns only // when actor has also initialized. This eliminates timing issues at // application start up. m_self.WaitForSignal(); }
public void Dispose() { // send destroy message to pipe m_self.Options.SendTimeout = TimeSpan.Zero; try { m_self.Send(EndShimMessage); m_self.WaitForSignal(); } catch (AgainException) {} m_shimThread.Join(); m_self.Dispose(); }
/// <summary> /// Release any contained resources. /// </summary> public void Dispose() { //send destroy message to pipe m_self.Options.SendTimeout = TimeSpan.Zero; try { m_self.Send(ActorKnownMessages.END_PIPE); m_self.WaitForSignal(); } catch (AgainException) {} m_shimTask.Wait(); m_self.Dispose(); }
protected WSSocket(NetMQContext context, IShimHandler <int> shimHandler) { int id = Interlocked.Increment(ref s_id); m_context = context; m_messagesPipe = context.CreatePairSocket(); m_messagesPipe.Bind(string.Format("inproc://wsrouter-{0}", id)); m_messagesPipe.ReceiveReady += OnMessagePipeReceiveReady; m_actor = new Actor <int>(context, shimHandler, id); m_messagesPipe.WaitForSignal(); }
private NetMQActor([NotNull] NetMQContext context, [NotNull] IShimHandler shimHandler) { m_shimHandler = shimHandler; m_self = context.CreatePairSocket(); m_shim = context.CreatePairSocket(); m_receiveEventDelegatorHelper = new EventDelegatorHelper <NetMQActorEventArgs>( () => m_self.ReceiveReady += OnReceive, () => m_self.ReceiveReady += OnReceive); m_sendEventDelegatorHelper = new EventDelegatorHelper <NetMQActorEventArgs>( () => m_self.SendReady += OnReceive, () => 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 initialized. This eliminates timing issues at // application start up. m_self.WaitForSignal(); }
protected virtual void Dispose(bool disposing) { // release other disposable objects if (disposing) { //send destroy message to pipe m_self.Options.SendTimeout = TimeSpan.Zero; try { m_self.Send(ActorKnownMessages.END_PIPE); m_self.WaitForSignal(); } catch (AgainException ex) { } m_self.Dispose(); } }