Asp.Net Асинхронная страница Остановка других запросов - PullRequest
1 голос
/ 02 марта 2011

У меня есть страница aspx для выполнения асинхронных вызовов.Страница получает данные из базы данных (проводит 30 секунд в хранимой процедуре), а затем возвращает результаты клиенту.Это делается с помощью сообщения jquery.

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

У меня есть <%@ Page Async="true" AsyncTimeout="600" Language="C#"... в .aspx

Мой .aspx.cs содержит:

      private SqlConnection _connection;
        private SqlCommand _command;
        private SqlDataReader _reader;

        protected void Page_Load(object sender, EventArgs e)
        {
            AddOnPreRenderCompleteAsync(BeginAsyncOperation, EndAsyncOperation);
        }

        protected IAsyncResult BeginAsyncOperation(object sender, EventArgs e, AsyncCallback cb, object state)
        {
            IAsyncResult result = null;
            try
            {
                SqlConnectionStringBuilder ConnectionStringBuilder = new SqlConnectionStringBuilder("**MyConnectionStringGoesHere**");
                ConnectionStringBuilder.AsynchronousProcessing = true;
                _connection = new SqlConnection(ConnectionStringBuilder.ConnectionString);

                _command = new SqlCommand("GetSiteUpdates", _connection) { CommandType = CommandType.StoredProcedure };
                _connection.Open();
                result = _command.BeginExecuteReader(cb, state);
                return result;
            }
            catch (Exception ex)
            {}
            return result;
        }

protected void EndAsyncOperation(IAsyncResult ar)
        {
            _reader = _command.EndExecuteReader(ar);
            try{
                   //Do Code Here
                   //Set Builder string here
                   Response.Clear();
                   Response.Write(builder.ToString());
                   _reader.Close();
                   Response.End();
            }
            catch (System.Threading.ThreadAbortException)
            {
                try { _reader.Close(); }
                catch { }
            }
            catch (Exception ex)
            {
                try { _reader.Close(); }
                catch { }
            }
}

Ответы [ 2 ]

5 голосов
/ 02 марта 2011

Причиной этого является блокировка сеанса. Когда страница открывается с доступом на чтение и запись к сеансу (по умолчанию), она блокирует сеанс, предотвращая загрузку других страниц, требующих сеанса.

Итак, две вещи здесь.

  1. Быстрое решение - отключить доступ к сеансу и / или установить его только для чтения для этой страницы.

  2. Поскольку вы возвращаете только JSON, вам следует использовать обработчик ASP.Net (ashx), так как это приводит к меньшим накладным расходам, чем страница aspx, и по умолчанию не имеет доступа к сеансу (его можно добавить при необходимости). ).

Кроме того, я не уверен, почему вы используете асинхронность здесь. Поскольку IIS должен ждать, пока страница вернет ответ, и поскольку эта страница больше ничего не делает, я не вижу никакого преимущества в ее асинхронном использовании.

0 голосов
/ 02 марта 2011

Тестируете ли вы соответствующий экземпляр IIS? Если вы используете сервер разработки, встроенный в Visual Studio, вы будете испытывать это однопоточное поведение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...