Как я могу ускорить мой цикл вызова инструмента командной строки в ASP.NET? - PullRequest
1 голос
/ 21 января 2012

У меня есть страница ASP.NET, которая получает список ip-адресов игрового сервера (быстро) и просматривает их, запустив для них инструмент командной строки, чтобы получить специальную информацию о игровом сервере. Я должен использовать инструмент командной строки, потому что я не знаю, как он работает, чтобы получать информацию от машин, и я не хочу изобретать велосипед. Цикл является медленной частью (неожиданный сюрприз). Каждый запуск инструмента командной строки занимает до секунды, поэтому при опросе в среднем приблизительно 60 IP-адресов загрузка страницы может занять от 30 до 60 секунд для получения нужных мне результатов.

Моя очевидная мысль была "многопоточность!" Что ж, я попробовал это с пулами потоков, но в итоге получился зависший веб-сайт, если на страницу одновременно заходило более одного человека. При этом использовалось только 4-5 вызовов одновременно до 60, что делало время загрузки 10 с. Так что он не только зависал с несколькими пользователями, но и был слишком медленным. Я был бы счастлив, если бы я мог получить его до 3 секунд.

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

Есть ли надежда?

Ответы [ 2 ]

3 голосов
/ 21 января 2012

Вы не должны опрашивать эти серверы "по требованию". Было бы лучше использовать ASP.NET для отображения списка информации о сервере и какой-либо другой процесс - например, службу Windows или запланированное задание - каждые несколько минут опрашивать серверы для создания этого списка. Подводя итог: служба создаст файл XML (например), а ASP.NET отобразит его пользователям. Таким образом, количество пользователей, просматривающих страницу, не влияет на количество попыток опроса серверов.

Обновление

Вам необходимо убедиться, что процесс эхо-тестирования серверов является одноэлементным. В частности, синглтон - это класс, в котором может существовать только один экземпляр. В более общем плане для вашего случая вам нужно установить глобальный флаг, который говорит, что «я в данный момент проверяю серверы», и другое глобальное значение даты и времени, которое говорит «в последний раз, когда я пинговал серверы, был чч: мм: сс» - вы может использовать словарь приложения для хранения логического флага и даты и времени. Каждый раз, когда кто-то загружает вашу страницу, проверяйте флаг, чтобы увидеть, проверяет ли он уже серверы. Если это так, не делай этого. Если флаг говорит «хорошо», проверьте текущее время в последний раз, когда вы это сделали. Если это менее 5 минут, не делайте этого. Все это должно быть сделано в фоновом потоке. Этот поток должен обновить XML-файл в App_Data. Все запросы к вашим страницам должны отображать эти данные немедленно. Запрос страницы никогда не должен блокироваться. Если файл отсутствует при первом вызове, верните сообщение «выполняется пинг, повторите попытку через 5 минут». Следуйте

Читайте о словаре состояния приложения ASP.NET здесь: http://msdn.microsoft.com/en-us/library/ie/ms178594.aspx

1 голос
/ 21 января 2012

Низкотехнологичным решением может быть вызов bat-файла, который выполняет каждый из exe-вызовов, вместо многократного exe-файла из asp.net.Сохраняет повторяющиеся оболочки в служебные данные ОС

Каждый вызов exe-файла может передавать результаты в текстовый файл, который затем может быть сразу считан сразу после того, как управление вернется из приложения asp.net из bat..

Если список ip меняется, то приложение asp.net может создать bat-файл перед его запуском.

...