/// <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); } }
/// <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); }