Асинхронный IHttpAsyncHandler
От: AndrewNeprokin  
Дата: 17.06.09 08:19
Оценка:
Имеется класс 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
        }

    class AsynchOperation : IAsyncResult
    {
        private bool _completed;
        private Object _state;
        private AsyncCallback _callback;
        private HttpContext _context;

        bool IAsyncResult.IsCompleted { get { return _completed; } }
        WaitHandle IAsyncResult.AsyncWaitHandle { get { return null; } }
        Object IAsyncResult.AsyncState { get { return _state; } }
        bool IAsyncResult.CompletedSynchronously { get { return false; } }

        public AsynchOperation(AsyncCallback callback, HttpContext context, Object state)
        {
            _callback = callback;
            _context = context;
            _state = state;
            _completed = false;
        }

        public void StartAsyncWork(GetContent.ProcessRequestDelegate func)
        {
            ThreadPool.QueueUserWorkItem(new WaitCallback(StartAsyncTask), func);
        }

        private void StartAsyncTask(object func)
        {
            ((GetContent.ProcessRequestDelegate)func).Invoke(_context);
            _completed = true;
            _callback(this);
        }
    }


Проблема в том, что он работает синхронно вчера весь день потратил на дебаг, но безрезультатно.
Т.е. получается что пока не сработает EndProcessRequest новый запрос не обрабатывается.
Если я внутри MyProcessRequest добавляю sleep на 30 секунд например, то в течении этого времени
BeginProcessRequest второй раз не вызывается.
Re: Асинхронный IHttpAsyncHandler
От: GlebZ Россия  
Дата: 17.06.09 11:21
Оценка:
Здравствуйте, AndrewNeprokin, Вы писали:

AN>Если я внутри MyProcessRequest добавляю sleep на 30 секунд например, то в течении этого времени

AN>BeginProcessRequest второй раз не вызывается.
Либо вы путаете теплое с мягким, либо я чего-то не понял. IHttpHandler, Page, или IHttpAsyncHandler нормальном работают параллельно. Возможно вы где то наткнулись на другие ограничения. IHttpAsyncHandler нужен только для того, чтобы освободить ресурсы (в основном это касается потока из пула которые поднимает ASP.NET) в случае долговременной работы. Больше смысла в нем нет.
Re[2]: Асинхронный IHttpAsyncHandler
От: AndrewNeprokin  
Дата: 17.06.09 11:36
Оценка:
Здравствуйте, GlebZ, Вы писали:

GZ>Либо вы путаете теплое с мягким, либо я чего-то не понял. IHttpHandler, Page, или IHttpAsyncHandler нормальном работают параллельно. Возможно вы где то наткнулись на другие ограничения. IHttpAsyncHandler нужен только для того, чтобы освободить ресурсы (в основном это касается потока из пула которые поднимает ASP.NET) в случае долговременной работы. Больше смысла в нем нет.


Да, скорее всего я неверно понял принцип работы IHttpAsyncHandler.
Проблема в любом случае остаётся — я не могу в одной сессии одновременно два и более раз вызвать ashx хендлер.

Может это быть из за IRequiresSessionState? Почему вообще у меня могло появиться такое ограничение?
Re[3]: Асинхронный IHttpAsyncHandler
От: GlebZ Россия  
Дата: 17.06.09 12:10
Оценка:
Здравствуйте, AndrewNeprokin, Вы писали:

AN>Может это быть из за IRequiresSessionState?

Нет.

AN>Почему вообще у меня могло появиться такое ограничение?

Кто у нас клиент?
Re[3]: Асинхронный IHttpAsyncHandler
От: Аноним  
Дата: 17.06.09 12:59
Оценка: 99 (2)
Здравствуйте, AndrewNeprokin, Вы писали:

AN>Может это быть из за IRequiresSessionState?


Может. Замени на IReadOnlySessionState.
Re[4]: Асинхронный IHttpAsyncHandler
От: AndrewNeprokin  
Дата: 17.06.09 13:11
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, AndrewNeprokin, Вы писали:


AN>>Может это быть из за IRequiresSessionState?


А>Может. Замени на IReadOnlySessionState.


Большое спасибо. Дело было именно в этом.
Можно узнать, почему такое происходит?
Re[5]: Асинхронный IHttpAsyncHandler
От: Аноним  
Дата: 17.06.09 13:41
Оценка:
Здравствуйте, AndrewNeprokin, Вы писали:

AN>Можно узнать, почему такое происходит?


Ну так задумано. Это такой костыль чтобы не задумываться о проблемах синхронизации/многопоточности если несколько параллельных запросов пишут/читают в один и тот же объект session. Проблему решили "дешево и сердито" — для чтения-записи сессия доступна только одному запросу, а остальные ждут в очереди пока эта сессия освободится.
В режиме "только для чтения" такой проблемы нет — одни и те же данные безконфликтно могут читаться сразу несколькими запросами. Но запись в сессию тогда недоступна.
Re[6]: Асинхронный IHttpAsyncHandler
От: AndrewNeprokin  
Дата: 17.06.09 13:53
Оценка:
А>Ну так задумано. Это такой костыль чтобы не задумываться о проблемах синхронизации/многопоточности если несколько параллельных запросов пишут/читают в один и тот же объект session. Проблему решили "дешево и сердито" — для чтения-записи сессия доступна только одному запросу, а остальные ждут в очереди пока эта сессия освободится.
А>В режиме "только для чтения" такой проблемы нет — одни и те же данные безконфликтно могут читаться сразу несколькими запросами. Но запись в сессию тогда недоступна.

Понятно...
Ещё раз большое спасибо за помощь и информацию. Она очень сильно выручила
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.