4

私の page1.aspx では、スレッドを使用してデータベースからレポートを生成しています。

//on button click
Hashtable ht = (Hashtable)Session["ReportParam"];
ReportThreadClass rth = new ReportThreadClass(ht);
Thread thread = new System.Threading.ThreadStart(rth .Run);
thread.Start();

私のスレッド クラスの rum メソッドでは、作成したページ数の Hashtable の値を更新しています。

//in thread' method        
public virtual void Run()
{      
    int pagecount=0;
    while(done)
    {
        //loading data from DB and generating html pages

        ht["Total_Pages"] = pagecount;
    }
}

私のPage2.aspxで、セッション変数から値を読み取っています

Hashtable ht = (Hashtable)Session["ReportParam"];
int TotalPages = (int) ht["Total_Pages"];

上記のコードを InProc モードで実行すると、すべてが正常に機能し、セッションから更新された値を取得しています。すべてのものは静的変数に格納され、ht はセッションによって参照されるため、セッションで自動的に更新されます (セッションに再割り当てするために HashTable は必要ありません)。

しかし、状態サーバー (OutProc モード) でコードを実行すると、ハッシュ テーブルをシリアライズして、セッション データを別のプロセスに格納する必要があります。

ただし、スレッドが完全に実行された後でも、Page2.aspx で Total_Pages の値が更新されません。

セッション変数のすべての更新を State-Server に保存するために発生するイベントまたはメソッドはありますか? はいの場合は教えてください。そうでない場合は、page2.aspx で更新された値を取得するためのアイデアを提案してください。

4

3 に答える 3

0

In Out Proc Mode セッションは何らかのイベントの後に保存されるため、スレッドがセッション変数を更新している場合、それはストレージに保持されません。

Inproc モードを使用している場合、セッションは静的辞書に保存されるため、スレッドがそれを更新すると、更新された値が任意のページに取得されます。

したがって、この状況には2つの解決策があります

  1. inProc モードを使用する
  2. セッションIDとしてキーを使用してスレッドクラスで辞書を維持し、値はハッシュテーブルです。したがって、page2.aspxがハッシュテーブルの値を読み取りたい場合、セッションIDをメソッドに渡し、必要な値を返します。
于 2013-06-19T09:02:30.353 に答える
0

効率は悪くなりますが、おそらく Page2 のページ数についてデータベースに ping を実行するだけです。

または、他のすべての操作と同時に、Page1 のページ カウント用に別のセッション値を作成します。(編集:2番目の部分は気にしないでください。それは、ルネが以下で提案したものです)。

于 2013-06-18T23:45:21.527 に答える