私は非同期呼び出しを行う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 { }
}
}
データベースがデータを返すのに30秒かかり、その30秒間にサーバー上のスレッドを他のユーザーなどの他の要求に応答させたいので、非同期にすることに決めました。 – Bob
http: /msdn.microsoft.com/en-us/library/ms178581.aspx、異なるセッションIDの要求は同時にセッションにアクセスできます。同じセッションIDに対する別の要求だけがロックを待つ必要があります。 – mbeckish
ありがとう、これは私が必要としたものです - ashxオプションを使用しました。 – Bob