我有一个后台工作器,我正在运行一个安装程序以循环并发送http命令到这些设备以更新其固件。目前它非常缓慢,尽管每个都发送并发送它。将Backgroundwork中的循环转换为多线程程序
我的第一个问题是,我该如何多线程这样才能提高速度?通常我会为每个设备创建一个任务,添加到任务数组中,并执行“全部等待”。但是这里的设备数量可能会达到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(一个字符串)中以显示在最后,供用户知道是否出错。
所以,既然你说瓶颈是网络,它会使带宽变得沉重,你会建议把它保留在这个方法中吗? HTTP请求正在发送更大的文件,所以你是对的,因为它会像发送2个鲸而不是1个。 – Kat 2014-10-13 12:58:55
就像我说的,你可以试一试。我不知道你的流程的所有进出,所以你可能会在准备另一个文件或做其他事情时发送一个文件,我不知道。但是,如果你有任何额外的速度,它不会很明显。 – Steve 2014-10-13 14:04:22