|
分類:[.NET 全般]
以下のURLを参考に (http://blogs.wankuma.com/jitta/articles/19448.aspx)
VB.NETに変換してみたのですが、 ☆の部分がコンパイルエラーになってしまい。 ☆☆の部分では記載方法が理解できていない状態で困っています。 対応方法が判る方、教えていただけると助かります。
もう一点ですが
サンプルが正しいものとすると 「長い処理を開始する画面」の 「← 1」 と 「お待ちください画面」の 「← 2」が違う画面なのに連動できる 理由が理解でできません。
素人的な質問で理解しにくいかと思いますが よろしくお願いします。
以下、サンプルをVB.NETに置き換えた物です。
---------------------------------------------------------------
'長い処理をするクラス。ここでは LongLongWait 'クラスとして、指定された回数、1秒スリープを実行しています。
Imports System.Threading Public NotInheritable Class LongLongWaiting Private ReadOnly _waitSec As Long Private _progress As String Private _thread As Thread ''' ''' 指定時間待機する処理を行うクラスのコンストラクタです。 ''' ''' 待機する秒数 Public Sub New(ByVal waitSec As Long) Me._waitSec = waitSec Me._progress = String.Empty Me._thread = Nothing End Sub ''' ''' 進捗状況を現す文字列を取得します。 ''' Public ReadOnly Property Progress() As String Get Return Me._progress End Get End Property ''' ''' 実行中かどうかを検査します。 ''' Public ReadOnly Property IsRunning() As Boolean Get Return (Me._thread IsNot Nothing) End Get End Property ''' ''' 指定時間待つ動作を開始します。 ''' Public Sub wait() Me.wait("") End Sub ''' ''' 指定時間待つ動作を開始します。 ''' ''' スレッドに付ける名前を指定します。 Public Sub wait(ByVal threadName As String) If Me._thread Is Nothing Then Me._thread = New Thread(New ThreadStart(Me.execute)) Me._thread.Name = threadName Me._progress = String.Empty Me._thread.Start() End If End Sub ''' ''' スレッドにて行われる、実際の処理です。 ''' Private Sub execute() Try For sec As Long = 0 To Me._waitSec - 1 System.Threading.Thread.Sleep(1000) Me._progress = String.Format("{0}/{1} 経過", sec + 1, Me._waitSec) Next Catch e As Exception Me._progress = e.Message Finally Me._thread = Nothing End Try End Sub End Class
「長い処理を開始する画面」。 ここでは、以下のコントロールがあることを前提とします。
待機する秒数を入力する、TextBox ポストバックを発生させるための、Button
サーバコード
Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Dim wait As New LongLongWaiting(Long.Parse(Me.TextBox1.Text)) ← 1 ☆Stocker.Add(Me.Session.SessionID, wait) wait.wait(Me.Session.SessionID) Response.Redirect("「お待ちください」") end sub
「お待ちください画面」。ここでは経過を示す文字列を表示するようにしています。 また、最初の画面に戻る為にボタンを用意しています。 Private Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) ☆Dim w As LongLongWaiting = TryCast(Stocker.GetValue(Me.Session.SessionID), LongLongWaiting) ← 2 If w Is Nothing Then Me.Response.Redirect(エラー画面など) End If If w.IsRunning Then Me.Response.AddHeader("refresh", "2") Me.Label1.Text = w.Progress Me.Button1.Enabled = False Else Me.Label1.Text = "終了しました。" ☆Stocker.Remove(Me.Session.SessionID) Me.Button1.Enabled = True End If End Sub
☆☆ ''' ''' 結果を格納します。 ''' Imports System.Collections; Public NotInheritable Class Stocker End Class
|