Обработка длительных операций из службы Windows - PullRequest
2 голосов
/ 06 марта 2010

Редактировать (снова): Позвольте мне упростить мою проблему. У меня есть служба Windows, которая предоставляет некоторые конечные точки WCF с помощью методов, таких как:

int ExecuteQuery(string query) {
   // asynchronously execute query that may take 1 second to 20 minutes
   return queryId;
}

string GetStatus(int queryId) {
   // return the status of the query (# of results so far, etc)
}

Каков наилучший способ реализации метода ExecuteQuery? Должен ли я просто позвонить ThreadPool.QueueUserWorkItem, чтобы получить мой запрос?

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

Аналогом является веб-браузер, который загружает несколько файлов одновременно, и у вас есть менеджер загрузок, который может отслеживать состояние каждого файла.

Ответы [ 5 ]

3 голосов
/ 06 марта 2010

Взгляните на Microsoft Message Queuing (MSMQ) :

Технология Microsoft Message Queuing (MSMQ) позволяет приложениям, работающим в разное время, обмениваться данными через разнородные сети и системы, которые могут быть временно отключены. MSMQ обеспечивает гарантированную доставку сообщений, эффективную маршрутизацию, безопасность и обмен сообщениями на основе приоритетов. Его можно использовать для реализации решений как для асинхронных, так и для синхронных сценариев обмена сообщениями.

Приятно осознавать, что Windows Communication Foundation (WCF) может использовать службы очередей, предлагаемые MSMQ.

1 голос
/ 10 марта 2010

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

Так что, если это не хитрый вопрос, то вы спрашиваете, как именно передать запрос в ThreadPool.QueueUserWorkItem?

1 голос
/ 08 марта 2010

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

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

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

0 голосов
/ 09 марта 2010

Я бы использовал WWF (4.0):

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

0 голосов
/ 06 марта 2010

Добавляя к ответу MSMQ, вы можете подумать о том, чтобы рассмотреть возможность использования Enterprise Service Bus (ESB) для обработки подобных вещей, если в будущем возникнет проблема масштабируемости. Проверьте NServiceBus для одного примера .NET.

...