2009-10-14 3 views
0

У меня есть два таймера, каждый из которых сразу вызывает асинхронную обратную передачу после отображения страницы. Каждый из асинхронных обратных передач загружает некоторые дорогие данные. Итак, когда я отлаживаю это, кажется, что первый асинхронный обратный вызов происходит, и результаты отображаются, а второй асинхронный обратный вызов возникает только после завершения первого асинхронного postback.Два асинхронных обратных вызова одновременно?

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

Отказ от ответственности: У нас мало пользователей, но страница загружается быстро. Поэтому нам все равно, сколько потоков требуется для обработки одной страницы.

Любые идеи? Спасибо за прочтение.

+1

Я идиот ... Я придумал тест: Второе предупреждение не отображается до тех пор, пока не произойдет первый асинхронный обратный вызов. Итак, я полагаю, что PageRequestManager фактически ставит в очередь асинхронные обратные вызовы. Кто-нибудь согласен/не согласен? Как я могу выполнить то, что хочу? –

ответ

1

Вы не можете сделать два асинхронных постбэк в то же самое время, потому что они имеют доступ к:

  1. к пользовательской сессии, и вы не может на синхронизирует сессию модификации между 2 requestst
  2. на страницу ViewState и вы не может возвращать с ответами два разных несвязанных ViewStates, которые воссозданы при каждом асинхронном запросе.

Вы можете сделать несколько запросов асинхронного доступа к сессионным HttpHandlers. Поправьте меня, если я ошибаюсь :)

0

Так сценарий выглядит следующим образом:

  1. пожаров Таймер Т1 вызова функции F1. F1 возвращает обратный вызов C1 на сервер
  2. Таймер T2 запускает функцию вызова F2. F2 приводит к обратному вызову C2 к серверу

Если T1 и T2 должны были срабатывать «точно» в одно и то же время, то JavaScript не может обрабатывать F1 и F2 в одно и то же время, поскольку JavaScript является однопоточным Окружающая среда. Одно из событий (скажем, F1) должно завершиться до того, как другое событие (F2) может быть запущено.

Смотрите следующую большую статью Резиг: How Javascript Timers Work

Однако, я понимаю, что обратные вызовы C1 & C2 выполняются асинхронно, так что наличие выстрелили C1 прочь к серверу, F1 может затем завершить позволяет F2 для запуска и C2, который должен быть запущен на сервер.

Тогда, если, скажем, C2 возвращен дробно до C1, то результаты C2 должны быть полностью обработаны до результатов C1.

Почему вы не видите это поведение?

Я не уверен, но разве может быть, что ваша среда разработки эффективно регулирует количество потоков, которые можно обрабатывать последовательно? Если бы вы запускали его на сервере Windows вне среды отладки, каково было бы поведение?