예제 #1
0
        /// <summary>
        /// Точка входа для всех threads из pool
        /// </summary>
        /// <param name="obj"></param>
        private void RunTask(object obj)
        {
            try
            {
                while (!stop)
                {
                    bool isTimeOut = !WaitHandle.WaitAll(this.handlers, TimeSpan.FromSeconds(2));
                    if (isTimeOut)
                    {
                        continue;
                    }
                    WCTask task = this.taskQueue.Dequeue();
                    Log.Info("thread {0} taked a task {1} from queue",
                             Thread.CurrentThread.Name, task.ToString());
                    this.mutex.ReleaseMutex();
                    // мы не уверены в том, что пользователь
                    // нашего пула создал корректный код задачи (task)
                    try
                    {
                        task.Execute();
                        Thread.Sleep(2000 * this.maxThreads); // типа работает.
                    }
                    catch (Exception ex)
                    {
                        Log.Error(ex);
                    }
                }
                Log.Info("thread {0} went out from loop",
                         Thread.CurrentThread.Name);
            }
            catch (ApplicationException ex)
            {
                // это может быть не только mutex но и код
                // стратегии, который инжектится в priorityqueue.

                /* Начиная с версии 2.0 платформы .NET Framework, в
                 * следующем потоке, получившем мьютекс, выдается исключение
                 * AbandonedMutexException.
                 * Недопустим этого!
                 */
                Log.Error(ex);
            }
            catch (Exception ex)
            {
                // это выбросил либо наш
                this.mutex.ReleaseMutex();
                Log.Error(ex);
            }
        }
예제 #2
0
        /// <summary>
        /// Ставит task в очередь task queue на выполнение.
        /// Throws ArgumentNullException.
        /// </summary>
        /// <param name="task">Task to execute</param>
        /// <param name="priority">Task prioriry</param>
        /// <returns></returns>
        public bool Execute(WCTask task, Priority priority)
        {
            if (task == null)
            {
                throw new ArgumentNullException("task");
            }

            if (stop == true)
            {
                return(false);
            }

            this.mutex.WaitOne();
            int prevCount = this.semaphore.Release(1);

            this.taskQueue.Enqueue(task, priority);
            Log.Info("task {0} puted into queue", task.ToString());
            this.mutex.ReleaseMutex();

            return(true);
        }
 public void Enqueue(WCTask task, Priority priority)
 {
     this.tasks[priority].Enqueue(task);
 }