2017-05-29 22 views
0

私はBackgroundWorkerを実行しており、その進行状況を報告したいと考えています。下の例では、BackgroundWorkerが反復処理するテストリストを作成します。問題は、行のsender.ReportProgress(i) 'にあります。私はOption Strictを持っていると、Late Bindingの問題のために私の使用が気に入らない。これをコード化してその問題を回避する別の方法はありますか?VB.NetのBackgroundWorkerで遅れてバインドする問題

Public Class Form1 

    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load 
     ' Configuring for Background Workers 
     Control.CheckForIllegalCrossThreadCalls = False 

     Dim MyList As New List(Of String) 
     For a As Integer = 0 To 100 
      MyList.Add(CStr(a)) 
     Next 
    End Sub 

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click 
     Dim bgw As New System.ComponentModel.BackgroundWorker 
     bgw.WorkerReportsProgress = True 
     bgw.WorkerSupportsCancellation = True 
     AddHandler bgw.DoWork, AddressOf bgw_DoWork 
     ' I create a BackgroundWorker here rather than add one in the toolbox so that I can specify the Handler and use different Handler routines for different part of a large program. 

     Button1.Enabled = False 
     Dim progress As New Progress(bgw) 
     progress.ShowDialog() 
     Button1.Enabled = True 
    End Sub 

    Private Sub bgw_DoWork(sender As System.Object, e As System.ComponentModel.DoWorkEventArgs) 
     For i = 0 To MyList.Count -1 
      Label1.Text = MyList(i) 
      sender.ReportProgress(i) 
      System.Threading.Thread.Sleep(200) 
      Label1.Refresh() 
     Next 

    End Sub 

End Class 


Public Class Progress 
    Private WithEvents _BGW As System.ComponentModel.BackgroundWorker 

    Public Sub New(ByVal BGW As System.ComponentModel.BackgroundWorker) 
     _BGW = BGW 
     InitializeComponent() 
    End Sub 

    Private Sub frmProgress_Shown(sender As Object, e As System.EventArgs) Handles Me.Shown 
     If Not IsNothing(_BGW) Then 
      _BGW.RunWorkerAsync() 
     End If 
    End Sub 

    Private Sub _BGW_ProgressChanged(sender As Object, e As System.ComponentModel.ProgressChangedEventArgs) Handles _BGW.ProgressChanged 
     ProgressBar1.Value = e.ProgressPercentage 
     Label1.Text = e.ProgressPercentage 
    End Sub 

    Private Sub _BGW_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles _BGW.RunWorkerCompleted 
     Me.Close() 
    End Sub 
End Class 
+0

問題があるのではなく、 'ReportProgress'メソッドです。' System.Object'にはそのようなメソッドはありません。他にもいくつか問題があります。副題として、[ツアー]ページにアクセスする必要があります。過去3つの投稿には5つの回答がありますが、いずれの回答も受け入れられていないため、すべて公開されています。 – Plutonix

+0

ご意見ありがとうございます。他の問題は何ですか?受け入れについてOK - 私は私がそうしていたことを認識していませんでした。 –

答えて

1
CType(sender, BackgroundWorker).ReportProgress(i) 
+0

少し注意してください:[** 'DirectCast' **](https://docs.microsoft.com/en-us/dotnet/articles/visual-basic/language-reference)を使用する方が良い/演算子/ダイレクトキャスト演算子)を使用します。 'CType'は_ **別の** _型に変換するときに使われることになっています(例えば' Byte'を 'Integer'に変換しますが、' Option Strict'を使わないときは暗黙的に行われます)。 –

+0

2つの違いは、 'CType'が[**変換演算子**]を使用しようとしていることです(https://docs.microsoft.com/en-us/dotnet/articles/visual-basic/programming-guide/language -features/procedures/how-to-define-a-conversion-operator)を使用して変換を実行し、失敗した場合は代わりにキャストしようとします。 'DirectCast'はキャストを行うだけなので、オブジェクトを別のタイプに変換しようとしていないときは' CType'よりもはるかに高速です。 –

1

あなたはそれを持つ複数のアクションを実行したい場合も、このようなローカル参照変数を作成します。

Private Sub bgw_DoWork(sender As System.Object, e As System.ComponentModel.DoWorkEventArgs) 

    Dim bgw As System.ComponentModel.BackgroundWorker = DirectCast(sender, System.ComponentModel.BackgroundWorker) 

    ' ... now you can use "bgw" multiple times below instead of casting each time ... 

    For i = 0 To MyList.Count -1 
     Label1.Text = MyList(i) 
     bgw.ReportProgress(i) 
     bgw.SomethingElse() 
     bgw.MoreStuff() 
     System.Threading.Thread.Sleep(200) 
     Label1.Refresh() 
    Next 
End Sub 

明らかにこれはあなたのケースでは必要ありません、ただFYI ...

関連する問題