タイトル : Re^5: Form_Loadイベント 投稿日 : 2007/12/15(Sat) 09:16 投稿者 : 魔界の仮面弁士
> やってみましたが、上記のコード内でLabelのTextプロパティを設定すると DoWork(ワーカースレッド)から、フォームやコントロールといった メインスレッドのオブジェクトを操作する事はできません。 # コントロールだけでなく、たとえば Private a As Integer のような、 # 単純な変数の読み書きさえ、基本的には NG です。 ## 変数を排他ロックしたり、System.Threading.Interlocked にて ## 読み書きするならば安全ですが。 非同期処理の途中経過を表示したい場合は、ReportProgress メソッドを用います。 Public Class Form1 Private Sub Form1_Load(…… '進捗確認を行えるようにしておく。 Me.BackgroundWorker1.WorkerReportsProgress = True 'ついでに、キャンセルも行えるようにしてみる。 Me.BackgroundWorker1.WorkerSupportsCancellation = True Me.Button1.Text = "キャンセル" '処理開始 Me.BackgroundWorker1.RunWorkerAsync() End Sub '★ 途中経過を受け取るためのイベント ★ Private Sub BackgroundWorker1_ProgressChanged(…… '状況がイベントとして通知されるので、 'ProgressPercentage (進捗のパーセンテージ)か 'UserState (状況を表す任意のデータ)を受け取り、表示する。 Me.Label1.Text = CStr(e.UserState) End Sub Private Sub Button1_Click(…… Me.Button1.Enabled = False 'キャンセル処理をさせたい時には、このメソッド。 Me.BackgroundWorker1.CancelAsync() End Sub Private Sub BackgroundWorker1_DoWork(…… Dim bgw As System.ComponentModel.BackgroundWorker bgw = DirectCast(sender, System.ComponentModel.BackgroundWorker) For n As Integer = 0 To 100 '進捗報告 Dim state As Object = "現在" & CStr(n) & "%です。" bgw.ReportProgress(n, state) '★ 途中経過を報告するためのメソッド ★ '時間のかかる処理 System.Threading.Thread.Sleep(100) '0.1秒待機 'キャンセルが要求されたか? If bgw.CancellationPending Then e.Cancel = True Return End If Next e.Result = "結果" End Sub Private Sub BackgroundWorker1_RunWorkerCompleted1(…… '結果表示 If e.Error IsNot Nothing Then Me.Label2.Text = "処理中にエラー発生:" & e.Error.Message ElseIf e.Cancelled Then Me.Label2.Text = "ユーザー操作によってキャンセルされました。" Else Me.Label2.Text = CStr(e.Result) End If End Sub End Class |