Сервисный вызов работает в основном потоке, но вылетает при многопоточности - PullRequest
2 голосов
/ 01 июля 2011

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

Моя задача была выполненаприменить многопоточность к этому процессу, чтобы сократить время, необходимое для запуска всех сайтов (почти 3000 сайтов, для последовательной работы которых требуется около 8 часов).Служба успешно выполняется, когда она не многопоточна, но в тот момент, когда я распределяю работу по нескольким потокам (тестирование с 3 прямо сейчас, плюс поток наблюдателя), возникает странный сбой, который, как представляется, возникает из-за вызова удаленных служб, которыедолжен предоставить данные.Это вызов SOAP / XML.

При запуске на тестовом сервере служба просто сдается и не выполняет свою задачу, но не прекращает работу.При запуске через отладчик (Dev Studio 2010) все это просто останавливается.Я запустлю его, и через несколько секунд он прекратит отладку, но не потому, что он завершен.Он не выбрасывает исключение и не дает мне никаких сообщений.С точками останова я могу пройти до точки, где она просто останавливается.Регистрация событий приводит меня к тому же месту.Он останавливается на строке кода, которая пытается получить ответ от веб-службы на других сайтах.И снова: он делает это только при многопоточности.

Я нашел некоторую информацию, которая предполагает, что есть ограничение на число соединений, которое по умолчанию равно 2. Предлагаемое решение состоит в добавлении некоторых тегов в app.config, ноэто не решило проблему ...

<system.net>
    <connectionManagement>
        <add address="*" maxconnection="20"/>
    </connectionManagement>
</system.net>

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

1 Ответ

0 голосов
/ 28 августа 2011
  1. Никаких сбоев, однако причудливым будет избежать сброса стека.Попробуйте выполнить этот дамп и посмотрите, указывает ли он на какую-то очевидную функцию.
  2. Используете ли вы какой-либо инструмент стороннего производителя или какой-либо другой компонент для фактического вызова службы?Если да, то, пожалуйста, проверьте документацию / contact-the-person-who-wrote-it, чтобы убедиться, что их компоненты поточно-ориентированы.Если это не так, у вас впереди большая задача.:) (Я работал с БД, которые не являются безопасными, поэтому поверьте мне, нередко можно встретить несколько глобальных статических переменных, разбросанных вокруг ..)

Наконец, если вы на 100% уверены, что этоИз-за нескольких потоков, установите блокировку в вашем рабочем потоке.Первоначально скажем, что он охватывает весь основной цикл.Теоретически он не должен завершаться сбоем, поскольку, несмотря на то, что он многопоточный, вы сериализовали выполнение.Следующим шагом является сокращение до объема потока.Скажем, в цикле main-while есть три функции, скажем, f1 (), f2 (), f3 (), затем начните блокировать f2 () и f3 (), оставив f1 незапертым ... Если все сработает, топроблема где-то в f2 или f3 ().Я надеюсь, что вы поняли, что я предлагаю

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

...