- PR -

ASP.NET 2.0で Threadで‘Session情報更新ができますか?

1
投稿者投稿内容
falconcj
会議室デビュー日: 2008/08/18
投稿数: 4
投稿日時: 2008-08-18 21:29
Page_LoadイベントでThreadをNewして、そのThreadのメソッドのなかからSession情報こうしんができますか?
例えばPage_Loadで  Session["Flag"]=1として Threadのメソッドの中で Session["Flag"]=0する後、そのSession["Flag"]情報をもらうと1ままですけど、どうすれば宜しいですか?

Session Modeは StateServerです。

[ メッセージ編集済み 編集者: falconcj 編集日時 2008-08-18 21:34 ]
よこけん
大ベテラン
会議室デビュー日: 2006/01/31
投稿数: 216
投稿日時: 2008-08-18 23:23
次のコードで検証してみましたが再現しませんでした。

コード:
protected void Page_Load(object sender, EventArgs e)
{
    this.Session["flag"] = 1;
    AutoResetEvent waitHandle = new AutoResetEvent(false);

    ThreadStart threadStart =
        delegate
        {
            this.Session["flag"] = 0;
            waitHandle.Set();
        };
    Thread thread = new Thread(threadStart);
    thread.Start();

    waitHandle.WaitOne();
    this._label1.Text = this.Session["flag"].ToString();
}



もしかして、別スレッドがセッションステートに値を格納する前にメインスレッドが値を取得してたりしませんか?
_________________
C#と諸々
falconcj
会議室デビュー日: 2008/08/18
投稿数: 4
投稿日時: 2008-08-19 09:36
よこけんさん、ありがとうございます。
実際のコード構造は以下の通りです。
コード:
--------------------------------------------------------------------------------

protected void Page_Load(object sender, EventArgs e)
{
this.Session["flag"] = 1;
 
   new Thread(methodA).Start();
}

//時間がかかる処理
protected void methodA()
{
//大きいSizeのFileをUpload
   .
   .
.
//処理が終わったら
this.Session["flag"] = 0;
}

//TimerでSession["flag"]をチェックします。
protected void Timer1_Tick(object sender, EventArgs e)
{
if(this.Session["flag"] == 0)
{
      //終わりメセッジを出す、Redirect
}
else
{
//進捗を表示
}
}
--------------------------------------------------------------------------------

ですけど、Timer_Tickイベントでthis.Session["flag"]がずっと1のままです。
M.M
会議室デビュー日: 2008/08/19
投稿数: 1
投稿日時: 2008-08-19 11:31
Ajaxを使っていますね?
Page_Loadで書き換えられていませんか?
falconcj
会議室デビュー日: 2008/08/18
投稿数: 4
投稿日時: 2008-08-19 11:48
すみません。

Page_Loadイベントで
if (!IsPostBack)
{
this.Session["flag"] = 1;
 
   new Thread(methodA).Start();
}
のようです。
Ajaxを使っています。
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2008-08-20 00:25
セッションはそんな使い方はできません。
InProcなら実際にはできてしまうかもしれませんがあまりやるべきじゃありません。
InProc以外ではまず完全に無理です。

DBにテーブル作って保存する辺りがまだ無難でしょう。

--追記
時間がかかる処理というのがどのくらいか分かりませんが、あまり長いようだとこれもまずいです(適当ですが、せいぜい数十秒以内程度にしといた方がいいでしょう)。


[ メッセージ編集済み 編集者: なちゃ 編集日時 2008-08-20 00:33 ]
falconcj
会議室デビュー日: 2008/08/18
投稿数: 4
投稿日時: 2008-08-20 06:36
有難うございます、本当に助かりました。
1

スキルアップ/キャリアアップ(JOB@IT)