将Backgroundworker中的For循环转换为多线程

时间:2014-10-10 19:21:15

标签: vb.net multithreading backgroundworker

我有一个后台工作者,我目前正在运行设置循环并将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(一个字符串)以显示在最后,以便用户知道是否出现了问题。

1 个答案:

答案 0 :(得分:1)

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

如果不是这种情况,或者你想测试这个,那么这是你的2个答案:

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

2:虽然我认为没有任何东西阻止你从其他线程运行线程,但是将更新返回到GUI的后勤工作可能是一场噩梦。我会从主线程中生成线程,这使得进度更新变得非常容易。