- PR -

ASP.NET:バックグラウンドで処理をさせるには?

投稿者投稿内容
Kirarin
会議室デビュー日: 2003/09/29
投稿数: 10
投稿日時: 2003-10-25 09:50
先日の失礼は大変申し訳ございませんでした。
でもせっかく頂いたサンプルなので、自分なりに理解、消化しておきたいと思い、
追って投稿することに致しました。
お許しくださいm(__)m

自分なりにVBに直して試してみました。(VS.NETでやっています)
サンプルの動作を確認したいのですが、
Button2を押したとき、Textbox1に指定したミリ秒数の間は「処理中」と表示され
その時間が経過すると「未処理」と表示される・・・ということですよね?

Textbox1に60000と入力して実際動作させてみると
Button1を押下したときには「未処理」から「処理中」に表示が変わるのですが
その後、Button2を1分たってから押しても「未処理」になりませんでした。

やはりどこか勘違いしているのでしょうか?
もしご指摘いただけるようなことがあれば、恐縮ですがお願いいたします。
VB自体にまだ慣れていないので、引き続きサンプルの解読に努めたいと思います。


一応今のところ以下のように記述しています。--------------------------
コード:

Public Class WebForm1
Inherits System.Web.UI.Page

Public Delegate Function HidoukiSyoriDelegate(ByVal duration As Integer) As String

Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
If Not IsPostBack Then
Session("state") = "未処理"
Label1.Text = Session("state").ToString()
End If
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
'処理クラス
Dim objExec As HidoukiClass = New HidoukiClass
'デリゲート
Dim dlgt As HidoukiSyoriDelegate = New HidoukiSyoriDelegate(AddressOf objExec.HidoukiSyori)
'コールバックメソッド
Dim cbm As AsyncCallback = New AsyncCallback(AddressOf CallbackMethod)
'非同期処理開始
Dim ar As IAsyncResult = dlgt.BeginInvoke(Int32.Parse(TextBox1.Text), cbm, dlgt)

Session("state") = "処理中"
Label1.Text = Session("state").ToString()
End Sub

'コールバックメソッド
Private Sub CallbackMethod(ByVal ar As IAsyncResult)
Dim dlgt As HidoukiSyoriDelegate = CType(ar.AsyncState, HidoukiSyoriDelegate)
Dim ret As String = dlgt.EndInvoke(ar)
Session("state") = ret
End Sub

'状態チェック
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Label1.Text = Session("state").ToString()
End Sub

End Class

'非同期処理対象クラス
Public Class HidoukiClass
Public Function HidoukiSyori(ByVal duration As Integer) As String
System.Threading.Thread.Sleep(duration)
Return "処理完了"
End Function
End Class



[ メッセージ編集済み 編集者: Kirarin 編集日時 2003-10-25 09:57 ]
ぴで
大ベテラン
会議室デビュー日: 2002/10/10
投稿数: 123
お住まい・勤務地: 東京
投稿日時: 2003-10-25 11:12
引用:
自分なりにVBに直して試してみました。(VS.NETでやっています)
サンプルの動作を確認したいのですが、
Button2を押したとき、Textbox1に指定したミリ秒数の間は「処理中」と表示され
その時間が経過すると「未処理」と表示される・・・ということですよね?

Textbox1に60000と入力して実際動作させてみると
Button1を押下したときには「未処理」から「処理中」に表示が変わるのですが
その後、Button2を1分たってから押しても「未処理」になりませんでした。

処理対象クラスからの戻り値「処理完了」をコールバックメソッドで受け取り、
セッション変数に格納しているので、セッションが有効であれば「処理完了」と表示されるはずです。
あくまでもサンプルなので、実際にはDBに格納するなどしたほうがよいかもしれません。
Kirarin
会議室デビュー日: 2003/09/29
投稿数: 10
投稿日時: 2003-10-25 12:02
回答ありがとうございましたm(__)m

コールバックから受け取るのは「処理完了」でした。
「未処理」ではありませんでしたね。間違えました(^^;)すみません。

セッションは有効になっていると思うのですが
もう一度確かめて、もしくはおっしゃるようにDBを利用するなどして
やってみたいと思います。
PAO
ベテラン
会議室デビュー日: 2004/10/21
投稿数: 66
投稿日時: 2004-10-21 16:45
この方法だと、質問者が書いている、CreateObject のところで、片一方のスレッドが終わってしまいませんか?

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