/// <summary>
 /// Adiciona na fila uma nova tarefa de escrita.
 /// </summary>
 /// <param name="task"></param>
 internal void Enqueue(IWriteBehindTask task)
 {
     lock (this)
     {
         _queue.Enqueue(task);
         Monitor.PulseAll(this);
     }
 }
 /// <summary>
 /// Define o estado para a tarefa.
 /// </summary>
 /// <param name="taskId">Identificador da tarefa.</param>
 /// <param name="state">Estado da tarefa.</param>
 internal void SetState(string taskId, TaskState state)
 {
     lock (this)
     {
         _queue.UpdateState(taskId, state);
         IWriteBehindTask task = _queue.Peek();
         if ((task != null) && (task.TaskId == taskId))
         {
             lock (_statusMutex)
                 Monitor.PulseAll(_statusMutex);
         }
     }
 }
 /// <summary>
 /// Remove a tarefa da fila.
 /// </summary>
 /// <param name="taskId">Identificador da tarefa.</param>
 internal void Dequeue(string taskId)
 {
     lock (this)
     {
         IWriteBehindTask task = _queue.Peek();
         if ((task != null) && (task.TaskId == taskId))
         {
             _queue.Dequeue();
         }
         else
         {
             var queue = new WriteBehindQueue(_queue);
             for (int i = 0; i < _queue.Count; i++)
             {
                 task = queue.Dequeue();
                 if ((task != null) && (task.TaskId == taskId))
                 {
                     _queue = queue;
                     break;
                 }
             }
         }
     }
 }
        /// <summary>
        /// Método de execução do processador.
        /// </summary>
        protected void Run()
        {
            while ((_worker != null) && !_isDisposing)
            {
                IWriteBehindTask task = null;
                try
                {
                    lock (this)
                    {
                        if (_queue.Count < 1)
                        {
                            Monitor.Wait(this);
                        }
                        if (_queue.Count > 0)
                        {
                            task = _queue.Peek();
                        }
                    }
                    if (task != null)
                    {
                        switch (task.State)
                        {
                        case TaskState.Wait:
                        {
                            lock (_statusMutex)
                            {
                                if ((task.State == TaskState.Wait) && !Monitor.Wait(_statusMutex, _timeout))
                                {
                                    task.State = TaskState.Execute;
                                }
                            }
                            continue;
                        }

                        case TaskState.Execute:
                            _queue.Dequeue();
                            lock (_processMutex)
                            {
                                if (!_isDisposing)
                                {
                                    task.Process();
                                }
                                continue;
                            }

                        case TaskState.Remove:
                            _queue.Dequeue();
                            continue;
                        }
                    }
                }
                catch (ThreadAbortException)
                {
                    break;
                }
                catch (Exception)
                {
                    continue;
                }
            }
        }
        /// <summary>
        /// Executa todas as tarefas da origem.
        /// </summary>
        /// <param name="args"></param>
        protected void ExecuteAllTaskForSource(object args)
        {
            IWriteBehindTask task = null;

            object[]  objArray = args as object[];
            string    str      = objArray[0] as string;
            bool      flag     = (bool)objArray[1];
            ArrayList list     = new ArrayList();

            for (int i = 0; i < _queue.Count; i++)
            {
                try
                {
                    task = _queue[i];
                    if ((task != null) && (task.Source == str))
                    {
                        list.Add(i);
                        if (flag)
                        {
                            switch (task.State)
                            {
                            case TaskState.Wait:
                            {
                                lock (_statusMutex)
                                    if ((task.State == TaskState.Wait) && !Monitor.Wait(_statusMutex, _timeout))
                                    {
                                        task.State = TaskState.Execute;
                                    }
                                continue;
                            }

                            case TaskState.Execute:
                                lock (_processMutex)
                                {
                                    if (!_isDisposing)
                                    {
                                        task.Process();
                                    }
                                    continue;
                                }

                            case TaskState.Remove:
                                _queue.Dequeue();
                                continue;
                            }
                        }
                    }
                }
                catch (ThreadAbortException)
                {
                    break;
                }
                catch (Exception)
                {
                }
            }
            for (int j = list.Count - 1; j >= 0; j--)
            {
                _queue.RemoveAt((int)list[j]);
            }
        }