Я вырывал свои волосы, пытаясь заставить это работать.Если я перешагиваю код в отладчике, все работает отлично.
Моя проблема в том, что если я просто запустил его, откликнется только последнее задание.Я предполагаю, что я перезаписываю фоновый рабочий или что-то.Я уверен, что я делаю несколько вещей неправильно, но мой код теперь грязный, так как я много пробовал во время поиска.Я знаю о задачах threadpool и .Net 4.0, но с трудом справляюсь с тем, что мне нужно.
В основном я пишу программу (более вероятно), которая затем берет список компьютеров и пингов, затемпроверяет время их работы и сообщает обратно.
Это нормально работает в потоке пользовательского интерфейса (очевидно, это блокирует мой экран).Я могу сделать так, чтобы фоновый работник просто делал это, но затем он выполнял каждый компьютер по одному, и хотя экран реагировал, он все еще занимал много времени.
Поэтому мой ответ заключался в том, чтобы иметь цикл for для каждогосервер запускает новый фоновый рабочий поток.Мое решение не работает.
Я видел другие потоки, которые я мог бы сделать, но мне нужно использовать с событиями вызов кода для обновления пользовательского интерфейса, когда каждый будет сделан.
Что такоесамый простой способ сделать это?
Вот мой код.В большинстве случаев это просто копирование, вставка + изменение, пока я не получу правильную работу.
Так что в основном классе у меня есть работник по тестированию.
(я пытался использовать 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