2014-10-10 61 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