2011-03-02 7 views
1

私は非同期呼び出しを行うaspxページを持っています。このページはデータベースからデータを取得し(ストアドプロシージャで30秒を費やして)、結果をクライアントに返します。これはjqueryポストによって行われます。Asp.Net非同期ページ他のリクエストの停止

問題は、30秒間ストアドプロシージャを実行しても、残りのサイトでは要求を実行できないということです。

私は.aspxの中<%@ Page Async="true" AsyncTimeout="600" Language="C#"...

マイ.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 { } 
      } 
} 

答えて

5

理由は、セッションのロックです。ページは、セッションへの読み取りアクセスと書き込みアクセスでオープンされます(これは必然的です)。セッションがロックされ、セッションのロードを必要とする他のページを阻止します。

ここには2つのものがあります。

  1. すぐに解決できるのは、セッションアクセスを削除したり、このページの読み取り専用に設定したりすることです。

  2. JSONを返すだけなので、ASP.Netハンドラ(ashx)を使用する必要があります。これはaspxページよりオーバーヘッドが少なく、デフォルトではセッションアクセスがありません(必要に応じて追加できます) 。

また、なぜここで非同期を使用しているのかわかりません。ページは応答を返すまで待たなければならず、このページは何もしていないので、非同期的に使用することは何のメリットもありません。

+0

データベースがデータを返すのに30秒かかり、その30秒間にサーバー上のスレッドを他のユーザーなどの他の要求に応答させたいので、非同期にすることに決めました。 – Bob

+2

http: /msdn.microsoft.com/en-us/library/ms178581.aspx、異なるセッションIDの要求は同時にセッションにアクセスできます。同じセッションIDに対する別の要求だけがロックを待つ必要があります。 – mbeckish

+0

ありがとう、これは私が必要としたものです - ashxオプションを使用しました。 – Bob

0

適切なIISインスタンスに対してテストしていますか? Visual Studioに組み込まれている開発サーバーを使用している場合は、この単一スレッドの動作が発生します。

+0

これは私が最初に考えたことですが、IISに公開した後もまだこの問題がありました。 – Bob

+1

Visual Studio開発サーバーは異なります(設定に関係なく、すべてがASP.Netエンジンによって処理されます)。この種類の動作はIISと異なる必要がありません。開発サーバーでは、マルチスレッドアプリケーションを問題なく使用できます。 – Kris

関連する問題