我有一个后台工作者,我目前正在运行设置循环并将http命令发送到这些设备以更新其固件。目前它非常缓慢,但每个循环并发送它。
我的第一个问题是,我如何多线程这样以提高速度?通常我会为每个设备创建一个任务,添加到一个任务数组,并执行一个"等待所有"。但是这里的设备数量可以达到300,因此我想将其限制为智能数量并动态执行。
我的第二个问题是,在已经是线程的后台基础工作中这样做是否明智(所以我可以显示进度条)?或者还有另一种更智能的方法吗?
这是当前的设置:
Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker.DoWork
'loop through devices
For Each assignment As FirmwareAssign In assignList
'firmwareassign is a struct with credentials for http, ip address, and device brand as strings
'Send Update Request
Select Case assignment.devcebrand.tolower
Case "brand1"
Logstatement += brand1.updateFirmware(assignment, assignment.deviceipaddress)
Case "brand2"
Logstatement += brand2.updateFirmware(assignment, assignment.deviceipaddress)
Case "brand3"
Logstatement += brand3.updateFirmware(assignment, assignment.deviceipaddress)
End Select
'don't worry, not real names of my classes
Next
End Sub
这些功能是基于网络的。他们将获取新的固件映像,并通过网络将其发送到IP地址。所以我也想限制它,因为我们不希望带宽疯狂。然后它会将它添加到logstatement(一个字符串)以显示在最后,以便用户知道是否出现了问题。
答案 0 :(得分:1)
由于您通过网络发送这些内容并且您的瓶颈很可能是网络,因此运行多个线程不会加快速度,如果它会减慢速度。
如果不是这种情况,或者你想测试这个,那么这是你的2个答案:
1:如果你已经在做一个集合,在这种情况下是一个任务数组,你几乎就在那里。我所做的是在当前循环中粘贴另一个循环并在数组/集合长度大于X(在您的情况下可能为10)并且在该循环中运行时检查线程状态并删除任何完成的循环。这将使它跳出内循环并添加更多线程,直到再次击中X.
2:虽然我认为没有任何东西阻止你从其他线程运行线程,但是将更新返回到GUI的后勤工作可能是一场噩梦。我会从主线程中生成线程,这使得进度更新变得非常容易。