我有一個後臺工作器,我正在運行一個安裝程序以循環併發送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