| タイトル | : 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 
 
 |