- PR -

[ASP.NET]待ち画面を作ろうとしているのですが・・・

1
投稿者投稿内容
かめたろ
ぬし
会議室デビュー日: 2003/03/20
投稿数: 255
投稿日時: 2004-03-05 18:58
世話になっております。
ASP.NET-SQLServerです。SessionはSQLServerに保存しています。
現在、待ち画面を作ろうとして悩んでいます。

あるウェブページから丸々拝借して、以下のようにコーディングしました。

呼び出し元
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim t1 As System.Threading.Thread = New System.Threading.Thread(AddressOf UserLogon)
t1.Start()
Session.Item("THREAD") = t1
Response.Redirect("WaitingPage.aspx")
End Sub
呼び出し先
(コード省略...)
一定時間毎にSessionに入れたThreadを受け取り、終わったかどうか判定

すると、呼び出し元の Response.Redirect で・・・
「セッション状態をシリアル化できません。セッション状態モードが 'StateServer' か 'SQLServer' の時は、シリアル化できないオブジェクトまたは MarshalByRef オブジェクトは許可されません。」
といわれてしまいます。
SessionはSQLServerに保存するという方針は変えられません。

過去ログで、待ちポップアップ画面の作り方は発見しましたが、できればページ遷移型の待ち画面にしたいのです。

なにか代替案はないでしょうか・・・?
知恵を絞っているつもりなんですが全然思い浮かばないのです。

[ メッセージ編集済み 編集者: かめたろ 編集日時 2004-03-08 09:09 ]
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-03-08 08:49
引用:

かめたろさんの書き込み (2004-03-05 18:58) より:

すると、呼び出し元の Response.Redirect で・・・
「セッション状態をシリアル化できません。セッション状態モードが 'StateServer' か 'SQLServer' の時は、シリアル化できないオブジェクトまたは MarshalByRef オブジェクトは許可されません。」
といわれてしまいます。
SessionはSQLServerに保存するという方針は変えられません。



 エラーの理由ですが、ThreadクラスにSerializable属性が付いていないため、シリアル化できず、セッションに格納できません。

 セッション変数にThreadインスタンスを放り込んでいるのは、スレッドの終了と解放を確実に行うためです。スレッドが終了したまま、親スレッドがJoinしないと、そのスレッドはゴーストとして、アプリケーション終了まで残ります。これを防ぐためです。

 ただし、スレッドオブジェクトの破棄については、MSDNに明確な記述を見つけられませんでした。.NET Frameworkの動作と、Win32APIでの動作が違っているかもしれません。.NET FrameworkではJoinしなくても、あるいは破棄の指示をしなくても、スレッドとして起動したメソッドが終了したらスレッドインスタンスも破棄されるのであれば、ここで行っている処理は不要です。

 Win32APIでは、終了時に勝手に解放させたり、あるいはプロセス中からスレッドを探したりといったことができるのですが、.NET Frameworkには該当するメソッドが無いようです。DataSlotというのがありましたが、これの説明には「スレッド固有」と有り、他のスレッドがデータを参照することはできないということでした。Applicationクラスにストアされているかと思いましたが、それも無いようです。

 短絡的には、アプリケーションレベルの(静的な)変数に入れてしまうことが、解決方法として考えられます。もちろんこうすると、アプリケーションが確保するメモリ量が多くなるので、仕様との相談となります。

[ メッセージ編集済み 編集者: Jitta 編集日時 2004-03-08 09:40 ]
かめたろ
ぬし
会議室デビュー日: 2003/03/20
投稿数: 255
投稿日時: 2004-03-08 11:02
ごめんなさい・・・。
調べ物に夢中になってしまい、マナーを忘れていました。
お詫びいたします。
1

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