タイトル | : Re^5: Form_Loadイベント |
記事No | : 6681 |
投稿日 | : 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
|