コード例 #1
0
        internal void Stop(bool force = false, int waitingtimems = 1000)
        {
            Status = AGENT_STATUS.STOPPING;

            var limite = DateTime.Now.AddMilliseconds(waitingtimems);

            while (Status != AGENT_STATUS.INACTIVE && DateTime.Now < limite)
            {
                Thread.Sleep(10);
            }

            if (Status != AGENT_STATUS.INACTIVE && force)
            {
                Status     = AGENT_STATUS.INACTIVE;
                CanExecute = false;
                try
                {
                    ThreadExec.Abort();
                }
                catch (Exception ex)
                {
                    Parent.Log("Agent.Stop.ThreadAbort", ex.ToString(), AgentPoolController <TData> .TIPO_LOG.ERRO);
                }
            }
        }
コード例 #2
0
        public void Set(AgentPoolController <TData> parent, string id)
        {
            Parent     = parent;
            Id         = id;
            CanExecute = true;
            Status     = parent.Status;

            ThreadExec = new Thread(new ThreadStart(ExecThread));
            ThreadExec.Start();
        }
コード例 #3
0
        protected void ExecThread()
        {
            while (CanExecute && Status != AGENT_STATUS.INACTIVE)
            {
                while (CanExecute && Status == AGENT_STATUS.WAITING)
                {
                    Thread.Sleep(SLEEP_WAITING_MS);
                }

                if (!CanExecute || Status == AGENT_STATUS.INACTIVE)
                {
                    break;
                }

                TData oNext = default;
                try
                {
                    oNext = GetNext();
                }
                catch (Exception ex)
                {
                    Parent.Log("Agent.GetNext", ex.ToString(), AgentPoolController <TData> .TIPO_LOG.ERRO);
                }

                if (oNext == null)
                {
                    if (Status == AGENT_STATUS.STOPPING)
                    {
                        break;
                    }

                    WaitQueueEmpty();
                }
                else
                {
                    HasQueueElement();

                    RETURN_ACTION s        = RETURN_ACTION.REQUEUE;
                    Boolean       executed = false;


                    //marca a data de fim se há throtting
                    DateTime?esperarAte = (Parent.ThrottingIntervalMillisecond == null || (int)Parent.ThrottingIntervalMillisecond == 0 ?
                                           null :
                                           (DateTime?)DateTime.Now.AddMilliseconds((int)Parent.ThrottingIntervalMillisecond));

                    //trava uma transação se há throtting
                    if (Parent.ThrottingSemaphore != null)
                    {
                        Parent.ThrottingSemaphore.Wait();
                    }

                    try
                    {
                        s = ProcessAgentData(oNext);

                        executed = true;
                    }
                    catch (Exception ex)
                    {
                        Parent.Log("Agent.ProcessAgentData", ex.ToString(), AgentPoolController <TData> .TIPO_LOG.ERRO);
                    }

                    if (s == RETURN_ACTION.REQUEUE)
                    {
                        Parent.Queue.Enqueue(oNext);
                    }

                    //espera pelo tempo de throtting se necessario
                    if (esperarAte != null)
                    {
                        while ((DateTime)esperarAte > DateTime.Now)
                        {
                            Thread.Sleep(5);
                        }
                    }

                    //libera a thread para o próximo
                    if (Parent.ThrottingSemaphore != null)
                    {
                        Parent.ThrottingSemaphore.Release(1);
                    }


                    if (executed && SLEEP_QUEUE_AFTER_PROCESS > 0)
                    {
                        Thread.Sleep(SLEEP_QUEUE_AFTER_PROCESS);
                    }
                }
            }
            Status = AGENT_STATUS.INACTIVE;

            Parent.Finished(this);
        }
コード例 #4
0
 internal void Start()
 {
     Status = AGENT_STATUS.ACTIVE;
 }