Как заставить службу Windows прослушивать дополнительный запрос, пока он уже обрабатывает текущий запрос? - PullRequest
1 голос
/ 22 февраля 2011

Мне нужно создать службу Windows на VB.net под Visual Studio 2003. Эта служба Windows должна считывать плоский файл (огромный файл из примерно миллиона записей) из локальной папки и загружать его в соответствующую таблицу базы данных. Это должно быть сделано в режиме отката (транзакция базы данных). При передаче данных в таблицу служба также должна прослушивать дополнительные клиентские запросы. Таким образом, если между клиентскими запросами на операцию отмены, сервис должен откатить транзакции и дать отзыв клиенту. Эта служба Windows также постоянно записывает в два файла журнала записи о состоянии и ошибках. Мой клиент - страница ASPX (веб-сайт).

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

Также не могли бы вы предложить мне идеальный способ достижения этого (например, лучше ли реализовать его в виде веб-службы или службы Windows, или просто удаленного объекта, или каким-либо другим способом).

Заранее всем спасибо за помощь!

Ответы [ 2 ]

2 голосов
/ 22 февраля 2011

Вы можете спроектировать свой сервис так, чтобы он порождал «рабочие потоки», которые выполняют тяжелую работу, а он просто прислушивается к дополнительным запросам. Поскольку будущие вызовы, вероятно, будут иметь дело с текущим работником, это может работать лучше, чем, скажем, проектирование его как веб-службы с использованием IIS.

Я бы настроил это так: основной поток службы прослушивает порт или канал для связи. Когда он получает вызов для обработки данных, он порождает рабочий поток, давая ему некоторый «токен состояния» (может быть таким же простым, как ссылка на логическую переменную), который он будет проверять через регулярные промежутки времени, чтобы убедиться, что он все еще работает , Поток запускается, сервис возвращается к прослушиванию (сетевые классы поддерживают буфер принятых данных, поэтому вызовы будут прерываться только в том случае, если они «истекут»).

Если служба получает вызов для прерывания, она устанавливает для токена значение «отмена». Рабочий поток прочитает это значение при следующем опросе, получит сообщение, откатит транзакцию и умрет.

Это можно настроить так, чтобы несколько работников одновременно обрабатывали несколько файлов, принадлежащих вызывающим абонентам, которым назначен их IP-адрес или какой-то уникальный идентификатор "сеанса", который вы передаете взад и вперед.

0 голосов
/ 22 февраля 2011

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

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

Использовать канал связи (например, привилегированную очередь) между потоками. Вы можете использовать Syste.Collections.Concurrent, если вы переходите на .NET 4.0 и другие функции, такие как CancellationTokens ...

WCF имеет преимущества перед веб-сервисом, но для сравнения его с сервисом Windows требуется больше деталей вашего проекта. В целом, WCF проще в реализации, чем служба Windows.

...