Должен ли первый вызов службы WCF занимать чрезвычайно много времени?

У меня есть операция службы WCF, которая просто выполняет запрос LINQ в базе данных SQL, ища 1 из 35 записей, которые имеют соответствующий Guid (это действительно настолько просто, насколько это возможно). Когда я вызываю этот метод из простого приложения-песочницы, он сразу возвращается. Однако, когда он у меня работает в службе Windows, первый вызов метода занимает около 25 секунд (я беру временную метку до и после вызова), а второй вызов (во всех отношениях идентичный первому, сделанный сразу после первый, только для целей тестирования) возвращается сразу.

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

Есть ли смысл в задержке, или здесь что-то идет не так?

Обновление: я подтвердил, что проблема не в самом методе. Сначала я вызвал совершенно другой метод службы, у которого была такая задержка, и два вызова исходного метода сразу после того, как оба выполняются мгновенно. Так что на самом деле проблема заключается в том, какой бы ни был первый вызов сервера.


person Mike Pateras    schedule 29.09.2010    source источник
comment
Из описания задержка не имеет смысла. Это может быть проблема с базой данных. Вы пытались запустить запрос непосредственно в БД?   -  person Noel Abrahams    schedule 29.09.2010
comment
Не точный запрос, но эквивалентный, да. Я почти уверен, что это не на стороне базы данных, потому что я могу вызвать ту же операцию из небольшого тестового приложения, и она сразу же вернется.   -  person Mike Pateras    schedule 29.09.2010


Ответы (3)


В вашем случае первый вызов сделает 2 вещи:

  • JIT-компиляция сервиса
  • Кэшировать запрос/данные на сервере базы данных

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

person Shiraz Bhaiji    schedule 29.09.2010
comment
Есть ли способ проверить, что эти вещи могут быть причиной моей проблемы? - person Mike Pateras; 29.09.2010
comment
Вы можете проверить загрузку ЦП, она должна резко увеличиться во время компиляции. - person Shiraz Bhaiji; 29.09.2010

Одна вещь, которую вы, возможно, захотите проверить, это посмотреть, есть ли у вашего рабочего процесса ASP.NET, на котором размещена служба, «тайм-аут простоя», мне кажется, что это первоначальный запуск ASP.net, который может быть причиной вашей проблемы.

person Mitchel Sellers    schedule 29.09.2010
comment
Вы имеете в виду на самом сервере? Если бы это было проблемой, разве я не увидел бы то же самое в своем тестовом приложении для песочницы? - person Mike Pateras; 29.09.2010
comment
Зависит от того, когда был сделан последний запрос перед тем, как вы сделаете первый запрос в песочнице. - person Mitchel Sellers; 29.09.2010
comment
Это было здорово проверить. Я запустил свой сервис, заметил 25-секундную задержку (он выдает временные метки в журнал), а затем перезапустил его. В тот раз у меня была 14-секундная задержка. Затем я перезапустил его снова и получил еще 25-секундную задержку. Я бы сказал, что запускал службу 3 раза менее чем за 3 минуты и все еще видел задержки. Затем я запустил песочницу дважды подряд, затем подождал 5 минут (ничего больше не задевало сервер) и снова запустил ее. Все три раза возвращался сразу. Довольно точно проблема, локальная для службы, не так ли? - person Mike Pateras; 29.09.2010

Пробовали ли вы включить трассировку WCF? Ищите задержки в границах активности в Действие процесса.

person Noel Abrahams    schedule 29.09.2010