Асинхронный 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 второй раз не вызывается.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.