Имеется класс GetContent : IHttpAsyncHandler
Внутри делаю по примеру из MSDN:
public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData)
{
var asynch = new AsynchOperation(cb, context, extraData);
var prg = new ProcessRequestDelegate(MyProcessRequest);
asynch.StartAsyncWork(prg);
return asynch;
}
public void EndProcessRequest(IAsyncResult result)
{
}
public bool IsReusable
{
get { return false; } // Пробовал и True и False
}
Проблема в том, что он работает синхронно вчера весь день потратил на дебаг, но безрезультатно.
Т.е. получается что пока не сработает EndProcessRequest новый запрос не обрабатывается.
Если я внутри MyProcessRequest добавляю sleep на 30 секунд например, то в течении этого времени
BeginProcessRequest второй раз не вызывается.
Здравствуйте, AndrewNeprokin, Вы писали:
AN>Если я внутри MyProcessRequest добавляю sleep на 30 секунд например, то в течении этого времени AN>BeginProcessRequest второй раз не вызывается.
Либо вы путаете теплое с мягким, либо я чего-то не понял. IHttpHandler, Page, или IHttpAsyncHandler нормальном работают параллельно. Возможно вы где то наткнулись на другие ограничения. IHttpAsyncHandler нужен только для того, чтобы освободить ресурсы (в основном это касается потока из пула которые поднимает ASP.NET) в случае долговременной работы. Больше смысла в нем нет.
Здравствуйте, GlebZ, Вы писали:
GZ>Либо вы путаете теплое с мягким, либо я чего-то не понял. IHttpHandler, Page, или IHttpAsyncHandler нормальном работают параллельно. Возможно вы где то наткнулись на другие ограничения. IHttpAsyncHandler нужен только для того, чтобы освободить ресурсы (в основном это касается потока из пула которые поднимает ASP.NET) в случае долговременной работы. Больше смысла в нем нет.
Да, скорее всего я неверно понял принцип работы IHttpAsyncHandler.
Проблема в любом случае остаётся — я не могу в одной сессии одновременно два и более раз вызвать ashx хендлер.
Может это быть из за IRequiresSessionState? Почему вообще у меня могло появиться такое ограничение?
Здравствуйте, AndrewNeprokin, Вы писали:
AN>Может это быть из за IRequiresSessionState?
Нет.
AN>Почему вообще у меня могло появиться такое ограничение?
Кто у нас клиент?
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, AndrewNeprokin, Вы писали:
AN>>Может это быть из за IRequiresSessionState?
А>Может. Замени на IReadOnlySessionState.
Большое спасибо. Дело было именно в этом.
Можно узнать, почему такое происходит?
Re[5]: Асинхронный IHttpAsyncHandler
От:
Аноним
Дата:
17.06.09 13:41
Оценка:
Здравствуйте, AndrewNeprokin, Вы писали:
AN>Можно узнать, почему такое происходит?
Ну так задумано. Это такой костыль чтобы не задумываться о проблемах синхронизации/многопоточности если несколько параллельных запросов пишут/читают в один и тот же объект session. Проблему решили "дешево и сердито" — для чтения-записи сессия доступна только одному запросу, а остальные ждут в очереди пока эта сессия освободится.
В режиме "только для чтения" такой проблемы нет — одни и те же данные безконфликтно могут читаться сразу несколькими запросами. Но запись в сессию тогда недоступна.
А>Ну так задумано. Это такой костыль чтобы не задумываться о проблемах синхронизации/многопоточности если несколько параллельных запросов пишут/читают в один и тот же объект session. Проблему решили "дешево и сердито" — для чтения-записи сессия доступна только одному запросу, а остальные ждут в очереди пока эта сессия освободится. А>В режиме "только для чтения" такой проблемы нет — одни и те же данные безконфликтно могут читаться сразу несколькими запросами. Но запись в сессию тогда недоступна.
Понятно...
Ещё раз большое спасибо за помощь и информацию. Она очень сильно выручила