Если все в порядке, чтобы обработать задачу вне области текущего запроса, то есть поставить ее в очередь на потом, вы можете подумать о такой последовательности 1 :
Реализацияресурс блокировка (монитор) и List
задач.
Для каждого запроса:
БлокировкаСписок, добавить текущее задание в список, помните номер.задач в списке, разблокируйте список.
Попробуйте получить блокировку .
Если неудачно:
- Если номерзадач в списке <порог X, затем Return. </li>
- В противном случае получить блокировку (заблокирует)
заблокировать список, переместить его содержимое ввременный список, разблокируйте список.
Если временный список не пуст
Снимите блокировку .
Первый запрос пройдет всю последовательность.Последующие запросы, если первый еще выполняется, будут закорочены на шаге 4.
Настройтесь на оптимальный порог X (или измените его на пороговое значение на основе времени).
1 Если вам нужно подождать для задачи в объеме запроса, то вам нужно немного расширить процесс:
Добавить два поля в задачукласс: флаг завершения и исключение .
На шаге 4, перед возвратом, ждать до завершения задачи (Monitor.Wait
) до флаг завершения становится true
.Если исключение не равно null
, выбросьте его.
На шаге 6 для каждой задачи установите флаг завершения и, необязательно, исключение а затем уведомить официантов (Monitor.PulseAll
).