2009-03-17 10 views
0

私は生成して保存できるASP.NETページを持っています。ページにはが実際に時間かかるので、ページをリクエストしたユーザーのセッションを使用している間に別のスレッドで実行したいと思います(ページを見ているように見えます)。ASPでページを生成するリクエストをスレッドしたい

コードビハインドから新しいスレッドを開くと、RequestオブジェクトとServer.Executeが破損するため、要求が行われている間に他のページを表示できるようにする別の方法が必要です。

これを行う方法はありますか?

ありがとうございます!

+0

は、なぜ、このWikiのでしょうか? –

+0

は同じことを迷っていた –

+0

私はそれをオフにすることはできますか? – Chris

答えて

0

、問題は我々が要求されたすべてのページがセッションのロックを開催しましたということでした。

http://blogs.msdn.com/amitsh/archive/2007/08/01/why-i-cannot-execute-two-requests-from-the-same-session-simultaneously-for-an-asp-net-application.aspx

これが期待される動作を:これは、それが不可能一度に複数のページを訪問しました。

  • セッション状態の書き込みアクセスを持っているページ(またはフレーム)(例えば<%の@ページ にEnableSessionState =「真」%:この背後にある理由 は、セッション状態 が ロック機構をリーダ/ライタを実装しています>)は、デフォルトで となり、リクエストが終了するまで、 セッションでライターロックを保持します。セッション状態は、アクセス(例えば<%する@ページ にEnableSessionState =「読み取り専用」%>)を読み取った

  • ページ(またはフレーム) 要求が完了するまでセッション にのみリーダーロックを保持します。

  • ロックの概念に基づいてわかるように、リーダーロックは ライターロックをブロックします。リーダーロック はリーダーロックをブロックしません。ライター ロックはすべてのリーダーとライターをブロックします ロック。

このロックは、イベント たAcquireRequestState以内に取得し 要求の イベントたReleaseRequestStateで放出されます。 (あなたが にEnableSessionState =「読み取り専用」を使用しない限り、デフォルトのオプション )2 フレーム/ページの両方がセッション状態 書き込みアクセス権を持っている場合だからこそ、1 フレーム/ページが最後まで他の を待つ必要があります。

EnableSessionStateをReadOnlyに設定すると、バックグラウンドで最初のページの実行が完了するのを待っている間に、リダイレクトをプッシュして別のページをリクエストできます。

1

これは、要求とセッションのデータのファサードを使用して確実に行うことができます。ただし、リクエストやセッションを直接呼び出すのではなく、ページ内のすべてのコードを変更してファサードを使用する必要があります。

個別のスレッドを起動するときは、RequestおよびSessionについて必要なすべての情報を格納する新しい(カスタム)SessionDataオブジェクトを作成し、データベースまたはHttpRuntime.Cacheに格納します。そのオブジェクトの識別子をスレッドに渡すと、スレッドはどのSessionDataオブジェクトを使用するかを知ることができます。

あなたが特別ワーカースレッドにいる場合は、そのIDでSessionFacadeをインスタンス化できます。それ以外の場合は、パラメータなしでインスタンス化します。ここで

がうまくいけば十分にあなたが始めるのは、SessionFacadeの例です:私たちの特別な場合には

class SessionFacade 
{ 
    private string _threadID; 

    public SessionFacade() { } 

    public SessionFacade(string threadID) 
    { 
     this._threadID = threadID; 
    } 

    public object this[string key] 
    { 
     get 
     { 
      return this.GetData(key); 
     } 
    } 

    protected object GetData(string key) 
    { 
     if(!string.IsNullOrEmpty(this._threadID)) 
     { 
      return ((SessionData)HttpRuntime.Cache[this._threadID])[key]; 
     } 
     else 
     { 
      return Session[key]; 
     } 
    } 
} 
関連する問題