2014-07-17 29 views
0

我有以下一段代碼,我試圖轉換爲parallel.foreach,並沒有任何運氣。我基本上試圖加速我的程序的這部分,並且想要並行運行for循環。幫助parallel.foreach

arrComputers = Split(currentrow(0), vbCrLf) 
For Each strComputer In arrComputers 
    do stuff 
    do stuff 
    n = DataGridView1.Rows.Add() 
    OtherSub(n, strComputer) 
Next 

回答

0

它可能不是一件簡單的事情剛剛並行運行,UI通常元素都喜歡上一個工作線程,所以你可能想打破這一點。

假設一切工作並行的循環看起來像

Parallel.ForEach(arrComputers, Sub(strComputer) 
           do stuff 
           do stuff 
           n = DataGridView1.Rows.Add() 
           OtherSub(n, strComputer) 
           end sub()) 

雖然香港專業教育學院採取使用

Dim Tasks as list(of task) 
For Each strComputer In arrComputers 
    tasks.add(task.run(sub() 
     do stuff 
     do stuff 
     n = DataGridView1.Rows.Add() 
     OtherSub(n, strComputer) 
    End Sub()) 
Next 
do OtherStuff 
do OtherStuff 
Task.waitall(tasks.toarray) 

我覺得它更靈活,我可以混合了需要的東西同步完成的事可以並行完成,也可以更爲乾淨地擴展到Net 4.5中的異步模型,其中task.waitall可以更改爲任務等待task.whenall,如果需要,我可以實現異步並行。 另外,如果你的lambda中有很多代碼,你可以將它粘在一個子文件中以提高可讀性。 Tim

+0

我得到運行(for task.run)不是system.threading.tasks.task和toarray(for task.toarray)的成員不是任務的成員。 – user3406776

+0

我也嘗試了你的第一個方法,並且得到一個「AmbiguousMatchException」錯誤。 – user3406776