Внедрение C # Job Queue с отложенным уведомлением о событии - PullRequest
2 голосов
/ 12 мая 2011

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

Наши основные требования:

  1. Необходимоуметь запускать задания параллельно или последовательно.Некоторые задания могут выполняться последовательно, а некоторые могут выполняться параллельно, даже если эти последовательные задания выполняются.
    (Я думаю, технически у нас может быть 2 очереди заданий, но базовая реализация все еще нуждается вуметь обрабатывать и то, и другое.)
  2. Нужно, чтобы задания запускали события прогресса - но мы хотим, чтобы события могли запускаться либо тогда, когда они готовы, либо в очереди и затем запускаются на основепри опросе из пользовательского интерфейса.
    (Мы хотим, чтобы все события обрабатывались в основном потоке графического интерфейса, поэтому при обновлении графического интерфейса мы надеемся запустить все события, произошедшие с момента последнего обновления.)

Спасибо,
Лирон

Ответы [ 2 ]

2 голосов
/ 12 мая 2011

quartz.net - довольно полный планировщик заданий

0 голосов
/ 12 мая 2011

Я сделал несколько похожих вещей, и на самом деле это просто очередь сообщений, поэтому вот несколько замечаний по базовой реализации:

  1. Создайте класс, содержащий некоторую очередь вашего типа работы(Очередь может быть хорошим выбором), Thread, AutoResetEvent, метод QueueJob и событие (скажем, «HandleJob» или что-то в этом роде)
  2. Запуск потока.Поток должен дождаться события, а затем обработать все задания в очереди.Для каждой работы просто запустите событие HandleJob.Если вам это нужно в потоке пользовательского интерфейса, просто используйте обработчик событий Invoke или BeginInvoke.Наконец, очистите очередь.
  3. Когда вызывается QueueJob, добавьте задание в очередь и сообщите о событии.
    • Примечание: вы хотите убедиться, что доступ к очереди синхронизирован

Кроме того, я думаю, что задания, которые должны выполняться параллельно, на самом деле недолжны быть заданиями - вы можете выполнять их в ThreadPool.

Отсюда вы можете выполнять временное выполнение (скажем, задание, которое должно выполняться через 10 секунд), выполнение итераторов и поддержку заданий, которыепредоставить доступ к AsyncWaitHandler (например, разрешить выполнение других заданий в ожидании чего-либо).

...