override protected void Run(StopThreadContract /*.Exp*/ terminator)
        {
            ServiceProviderContract /*.Exp*/ nsExp = spRef.Acquire();

            bool run = true;

            while (run)
            {
                switch receive {
                case nsExp.Connect(ServiceContract /*.Exp*/: Start newEp) :
                {
                        // We expect people to give us DnsContract/*.Exp*/ instances
                        DnsContract /*.Exp*/ newDnsEp = newEp as DnsContract /*.Exp*/;

                        if (newDnsEp == null)
                        {
                            // Invalid contract type. Fail.
                            nsExp.SendNackConnect(newEp);
                        }
                        else
                        {
                            // Signal ready and start servicing this contract
                            nsExp.SendAckConnect();
                            newDnsEp.SendReady();

                            // Spin up a new servicing thread
                            DNSExpConnection newConn = new DNSExpConnection(newDnsEp);
                            newConn.Start();
                        }
                }
                    break;

                case nsExp.ChannelClosed():
                    // Exit this thread
                    run = false;
                    break;

                case terminator.Terminate():
                    terminator.SendAckTerminate();
                    run = false;
                    break;

                case terminator.ChannelClosed():
                    run = false;
                    break;
                }
            }

            //delete nsExp;
        }
示例#2
0
        protected override void Run(StopThreadContract /*.Exp*/ terminator)
        {
            ServiceProviderContract /*.Exp*/ nsExp = spRef.Acquire();

            // Here is the set of client channels we service
            ESet < UdpContract /*.Exp*/ epSet = new ESet < UdpContract/*.Exp*/ ();

            while (true)
            {
                switch receive {
                //
                // Don't forget that we're selecting UdpContract endpoints
                // from the epSet endpoint-set. In each case that we
                // receive a message from one of those endpoints, we
                // need to remember to put the endpoint back into epSet
                // if we want to keep listening to it.
                //
                case ep.CreateUdpSession(UdpConnectionContract /*.Exp*/: Start newEP) in epSet:
                    {
                        // Move the endpoint to the ReadyState
                        newEP.SendReady();
                        // Create a dedicated thread to service this connection
                        UdpConnectionExpThread udpThread = new UdpConnectionExpThread(newEP);
                        udpThread.Start();
                        ep.SendAck();
                        epSet.Add(ep);
                    }
                    break;

                case nsExp.Connect(ServiceContract /*.Exp*/: Start newEp) :
                {
                        // We expect people top give us
                        // UdpContract/*.Exp*/ instances
                        // UdpContract/*.Exp*/:Start newUdpEp = newEp
                        // as UdpContract/*.Exp*/;
                        UdpContract /*.Exp*/ newUdpEp = newEp as UdpContract /*.Exp*/;

                        if (newUdpEp == null)
                        {
                            // Invalid contract type. Fail.
                            nsExp.SendNackConnect(newEp);
                        }
                        else
                        {
                            // Signal ready and start
                            // servicing this contract
                            nsExp.SendAckConnect();
                            newUdpEp.SendReady();
                            epSet.Add(newUdpEp);
                        }
                }
                    break;

                case ep.ChannelClosed() in epSet:
                    //delete ep;
                    break;

                case nsExp.ChannelClosed():
                    goto quit;

                case terminator.Terminate():
                    terminator.SendAckTerminate();
                    goto quit;

                case terminator.ChannelClosed():
                    goto quit;
                }
            }

quit:
            //delete nsExp;
            epSet.Dispose();
        }