私はこれを動作させるために私の髪を引き出しています。デバッガでコードをステップ実行すれば、すべてうまくいく。VB.Net複数のバックグラウンドワーカー - 最後のタスクが完了しました
私の問題は、実行したばかりの場合、最後のタスクだけが応答することです。私はバックグラウンドの仕事や何かを上書きしていると思います。私はいくつかのことを間違っていると確信していますが、検索中に多方面で試してみると、私のコードは面倒です。私はスレッドプールと.Net 4.0タスクを知っていますが、私が必要とすることをやるのは苦労しています。
基本的に私はコンピュータとpingのリストをとり、その稼働時間をチェックしてレポートを返すプログラムを作成しています。
これはUIスレッドで正常に動作します(明らかに画面がロックされます)。私はバックグラウンドワーカーにこれをやってもらうことができますが、それはそれぞれのコンピュータを1つずつ実行し、画面は応答しますが、それでも時間がかかります。
私の答えは、新しいバックグラウンドワーカースレッドを起動する各サーバーのforループを持つことでした。私の解決策は機能しません。
私はそれを行うことができる他のスレッドを見ましたが、イベントが発生したときにUIに更新するコードを呼び出すためにイベントを使用する必要があります。
これを行う最も簡単な方法は何ですか?
ここに私のコードです。ほとんど私はそれがうまく動作するまで、コピー貼り+変更です。
メインクラスでは、私はテストワーカーがいます。
は(私はTestworkerを()を使用してみましたが、それは私がWITHEVENTSことを行うことができませんでした)私はボタンを、リストのロードをクリックすると。
Private WithEvents TestWorker As System.ComponentModel.BackgroundWorker
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles Button1.Click
Button1.IsEnabled = False
Dim indexMax As Integer
indexMax = DataGridStatus.Items.Count
For index = 1 To (indexMax)
Dim Temp As ServerInfo = DataGridStatus.Items(index - 1)
Temp.Index = index - 1
Call_Thread(Temp)
Next
End Sub
Private Sub Call_Thread(ByVal server As ServerInfo)
Dim localserver As ServerInfo = server
TestWorker = New System.ComponentModel.BackgroundWorker
TestWorker.WorkerReportsProgress = True
TestWorker.WorkerSupportsCancellation = True
TestWorker.RunWorkerAsync(localserver)
End Sub
Private Sub TestWorker_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles TestWorker.DoWork
Dim iparray As IPHostEntry
Dim ip() As IPAddress
Dim Server As ServerInfo
Server = e.Argument
Try
'Get IP Address first
iparray = Dns.GetHostEntry(Server.ServerName)
ip = iparray.AddressList
Server.IPAddress = ip(0).ToString
'Try Pinging
Server.PingResult = PingHost(Server.ServerName)
If Server.PingResult = "Success" Then
'If ping success, get uptime
Server.UpTime = GetUptime(Server.ServerName)
Else
Server.PingResult = "Failed"
End If
Catch ex As Exception
Server.PingResult = "Error"
End Try
TestWorker.ReportProgress(0, Server)
Thread.Sleep(1000)
End Sub
Private Sub TestWorker_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles TestWorker.ProgressChanged
Dim index As Integer
Dim serverchange As ServerInfo = DirectCast(e.UserState, ServerInfo)
index = DataGridStatus.Items.IndexOf(serverchange)
' index = serverchange.Index
DataGridStatus.Items.Item(index) = serverchange
' ProgressBar1.Value = e.ProgressPercentage
DataGridStatus.Items.Refresh()
End Sub
Ping.SendAsync()の使用を検討しましたか? –