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); } } }
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(); }
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); }
internal void Start() { Status = AGENT_STATUS.ACTIVE; }