【发布时间】:2011-01-27 04:56:21
【问题描述】:
我一直在努力解决这个问题。如果我在调试器中逐步执行代码,一切都会很好。
我的问题是,如果我只是运行它,只有最后一个任务会响应。我猜我正在覆盖背景工作或其他东西。我确定我做错了一些事情,但是我的代码现在很混乱,因为我在搜索时尝试了很多方法。我知道线程池和 .Net 4.0 任务,但很难完成我需要的工作。
基本上我正在编写一个程序(更可能尝试),然后获取计算机列表和 ping,然后检查它们的正常运行时间并返回报告。
这在 UI 线程中运行良好(显然这会锁定我的屏幕)。我可以让后台工作人员执行此操作,但随后它会逐台执行每台计算机,并且在屏幕响应时仍需要很长时间。
所以我的回答是为每个启动新后台工作线程的服务器设置一个 for 循环。我的解决方案不起作用。
我已经看到了其他可以做到的线程,但是我需要使用事件来调用代码以在每个线程完成后更新到 UI。
最简单的方法是什么?
这是我的代码。大多数只是复制粘贴+修改,直到我让它正常工作。
所以在主课中我有 testworker。
(我尝试使用 Testworker() 但它说我无法使用事件)
当我单击按钮时,列表会加载。
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() 吗?