Потоки службы Windows с циклами и WCF - PullRequest
1 голос
/ 22 марта 2012

Прежде всего, я буду говорить о каком-то унаследованном коде, и мы стараемся избегать его максимально возможного изменения.Кроме того, мой опыт работы со службами Windows и WCF немного ограничен, поэтому некоторые вопросы могут быть немного новичками.Просто, чтобы дать немного контекста перед вопросом.

У нас есть существующий сервис, который зацикливается.Он проверяет через вызов базы данных, есть ли у него записи для обработки.Если он не находит никаких записей, он спит в течение 30 секунд, а затем просыпается, чтобы попытаться снова.

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

Loop* Читать запись из базы данных* Если нет записи из БД, обработайте все записи, которые были переданы через точку входа.* Никаких записей, спи 30 секунд.

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

Я знаю, что этот вопрос может быть сформулирован не совсем правильно, но я с новой стороны в работе с этим.Любая помощь будет оценена.

Ответы [ 2 ]

3 голосов
/ 22 марта 2012

Меня беспокоит параллелизм и удержание цикла и слушателя от наступления друг на друга.

Это не должно быть проблемой при условии правильной синхронизации доступа.

Самый простой вариант - использовать потокобезопасную коллекцию, такую ​​как ConcurrentQueue<T>, для хранения ваших элементов для обработки.Служба WCF может просто добавить элементы в коллекцию, не беспокоясь, и ваш следующий шаг обработки будет обработан.Синхронизация в этом случае действительно минимальна, поскольку очередь уже будет полностью поточно-ориентированной.

0 голосов
/ 22 марта 2012

В дополнение к превосходному ответу Рида вы можете сохранить записи в очереди MSMQ , чтобы предотвратить потерю записей вашей службой при завершении работы, перезапуске или сбое службы.

...