Несколько дней назад я задал этот вопрос:
Почему $ .getJSON () блокирует браузер?
Я запускаю шесть jQuery асинхронных ajax-запросов на одном и том же действии контроллера практически одновременно. Каждый запрос занимает 10 секунд, чтобы вернуться.
Посредством отладки и регистрации запросов к методу действия я замечаю, что запросы сериализуются и никогда не выполняются параллельно. то есть я вижу временную шкалу в моих журналах log4net, например:
2010-12-13 13:25:06,633 [11164] INFO - Got:1156
2010-12-13 13:25:16,634 [11164] INFO - Returning:1156
2010-12-13 13:25:16,770 [7124] INFO - Got:1426
2010-12-13 13:25:26,772 [7124] INFO - Returning:1426
2010-12-13 13:25:26,925 [11164] INFO - Got:1912
2010-12-13 13:25:36,926 [11164] INFO - Returning:1912
2010-12-13 13:25:37,096 [9812] INFO - Got:1913
2010-12-13 13:25:47,098 [9812] INFO - Returning:1913
2010-12-13 13:25:47,283 [7124] INFO - Got:2002
2010-12-13 13:25:57,285 [7124] INFO - Returning:2002
2010-12-13 13:25:57,424 [11164] INFO - Got:1308
2010-12-13 13:26:07,425 [11164] INFO - Returning:1308
Глядя на сетевую шкалу в FireFox, я вижу это:
Пример журнала, приведенный выше, и временная шкала сети Firefox относятся к одному и тому же набору запросов.
Сериализуются ли запросы на одно и то же действие с одной и той же страницы? Мне известно о сериализованном доступе к объекту Session
в том же сеансе, но данные сеанса не затрагиваются.
Я сократил код на стороне клиента до одного запроса (самый продолжительный), но он по-прежнему блокирует браузер, т. Е. Только когда запрос ajax завершается, браузер реагирует на нажатие любой ссылки.
Я также наблюдаю здесь (в инструментах разработчика Chrome), что при нажатии на ссылку, когда выполняется долго выполняющийся запрос ajax, она немедленно сообщает об ошибке Failed to load resource
, которая указывает на то, что браузер убил (или пытается убить) и ждете?) запрос ajax:
Однако браузеру все еще требуется время, чтобы перенаправить на новую страницу.
Являются ли запросы ajax действительно асинхронными или это ловкость рук, потому что на самом деле JavaScript является однопоточным?
Мои запросы просто слишком долго работают?
Проблема возникает также в Firefox и IE.
Я также изменил скрипт, чтобы использовать $.ajax
напрямую и явно установить async: true
.
Я запускаю это на IIS7.5, оба варианта Windows 2008R2 и Windows 7 делают одно и то же.
Сборки отладки и выпуска также ведут себя одинаково.