2014-10-10 60 views
0

我有一个后台工作器,我正在运行一个安装程序以循环并发送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(一个字符串)中以显示在最后,供用户知道是否出错。

回答

1

由于您通过网络发送这些文件,并且您的瓶颈很可能是网络,运行多个线程不会加快速度,如果有的话会减慢速度。

如果不是这种情况,或者你要测试的这款无论如何,这里是你的2个答案:

1:如果你已经在做的集合,在这种情况下一个任务数组,你几乎没有。我所做的是在当前循环中粘贴另一个循环,并在数组/集合的长度大于X(可能为10)的情况下运行,并在该循环中检查线程状态并删除任何已完成的循环。这将使其跳出内部循环并添加更多线程,直到再次点击X.

2:虽然我不认为有任何东西阻止您从其他线程运行线程,但将更新回送到GUI可能是一场噩梦。我会从主线程中产生线程,这使得进度更新变得非常简单。

+0

所以,既然你说瓶颈是网络,它会使带宽变得沉重,你会建议把它保留在这个方法中吗? HTTP请求正在发送更大的文件,所以你是对的,因为它会像发送2个鲸而不是1个。 – Kat 2014-10-13 12:58:55

+1

就像我说的,你可以试一试。我不知道你的流程的所有进出,所以你可能会在准备另一个文件或做其他事情时发送一个文件,我不知道。但是,如果你有任何额外的速度,它不会很明显。 – Steve 2014-10-13 14:04:22