длительная блокировка процесса - PullRequest
0 голосов
/ 31 октября 2011

Я создаю проект webservice + servicebus, где пользователь может сделать что-то вроде

public void ExecuteLongProcess(DateTime fromDate,string aggregateId){}

Этот метод немедленно возвращается, но отправляет по шине запрос на операцию.

Мои проблемы начинаются, когда несколько пользователей запрашивают длительный процесс по одному и тому же aggregateId, когда другой уже запущен.

Решением, о котором я думаю, является Задача, которая выполняется непрерывно и ищет в Queue<LongProcessTask> операцию, которая должна быть выполнена, поэтому я запускаю только один процесс за раз, или будущая реализация будет состоять из нескольких процессов, если другой aggregateId.

Таким образом, я не перекрываю длительный процесс над одним и тем же агрегатом.

Другие идеи?

Ответы [ 2 ]

0 голосов
/ 03 ноября 2011

В своем ответе вы говорите, что несколько потоков будут принимать задачи из параллельной очереди.В этом случае есть вероятность, что две задачи с одинаковым aggregateId могут выполняться одновременно.Я не знаю, является ли это проблемой для вас, если да, то вы должны использовать разные очереди для каждого aggregateId.

Если порядок задач не является проблемой, тогда я рекомендую использовать BlockingCollection .Потому что возникает вопрос: что вы планируете делать с несколькими потоками потребителей, если в параллельной очереди нет задачи.

while(some_condition_to_keep_thread_alive)
{
  if(!queue.TryDequeue(...))
    continue;
  else 
  {
    //do the job
  }
}

Этот код заставит ваши ядра сходить с ума, если queue пусто.Вам нужен механизм блокировки.BlockingCollection сделает это за вас.

Вы настаиваете на использовании ConcurrentQueue?Хорошо SemaphoreSlim ваш друг.

0 голосов
/ 03 ноября 2011

Я создал TaskRunner, который создает некоторую непрерывно работающую задачу (число зависит от ядер процессора), которая просматривает параллельную очередь и запускает каждую операцию в ожидании. TaskRunner получает от Windsor обработчик для каждого типа операции, чтобы оставить обработку каждой операции в классе в стороне.

...