示例#1
0
        public object Accept(int timeout, out S service)
        {
            lock (_lock)
            {
                var myTicket = new Ticket();
                if (_services.Count != 0)
                {
                    RemoveFirstRequestedToken(ref myTicket);
                    service = myTicket.token.service;
                    var token = myTicket.token;
                    return(token);
                }

                myTicket._condition = new Object();
                myTicket.processing = Status.Accepting;
                _services.AddLast(myTicket);
                int lastTime = (timeout != Timeout.Infinite) ? Environment.TickCount : 0;
                while (true)
                {
                    SyncUtils.Wait(_lock, myTicket._condition, timeout);
                    if (myTicket.processing == Status.InProcess)
                    {
                        service = myTicket.token.service;
                        return(myTicket.token);
                    }
                    if (SyncUtils.AdjustTimeout(ref lastTime, ref timeout) == 0)
                    {
                        _services.Remove(myTicket);
                        service = default(S);
                        return(null);
                    }
                }
            }
        }
示例#2
0
        public bool Request(S service, int timeout, out R response)
        {
            lock (_lock)
            {
                Ticket myTicket;
                if (CheckForAcceptingTokens(out myTicket, service))
                {
                    SyncUtils.Notify(_lock, myTicket._condition);
                }
                else
                {
                    myTicket.token      = new Token(service);
                    myTicket._condition = new Object();

                    _services.AddLast(myTicket);
                }

                int lastTime = (timeout != Timeout.Infinite) ? Environment.TickCount : 0;
                while (true)
                {
                    try
                    {
                        SyncUtils.Wait(_lock, myTicket._condition, timeout);
                        if (myTicket.processing == Status.Concluded)
                        {
                            response = myTicket.token.response;
                            return(true);
                        }

                        if (SyncUtils.AdjustTimeout(ref lastTime, ref timeout) == 0 &&
                            myTicket.processing == Status.Open)
                        {
                            _services.Remove(myTicket);
                            response = default(R);
                            return(false);
                        }
                    }
                    catch (ThreadInterruptedException e)
                    {
                        if (myTicket.processing == Status.Open)
                        {
                            Thread.CurrentThread.Interrupt();
                            _services.Remove(myTicket);
                            response = default(R);
                            return(false);
                        }
                        if (myTicket.processing == Status.Concluded)
                        {
                            response = myTicket.token.response;
                            return(true);
                        }
                        timeout = Timeout.Infinite;
                    }
                }
            }
        }