2011-03-26 54 views
7

我想在一個while循環中使用TPL,並且我需要將任務的一些值傳遞給循環。舉例來說,在此顯示與遞增(其中任務創建要求的行之後必然)指數爲例:循環內啓動任務:如何傳遞循環內可更改的值?

int index = 0; 
Task[] tasks; 
while(/*condition*/) 
{ 
    tasks[index] = Task.Factory.StartNew(() => DoJob(index)); 
    index++; 
} 

但是,當然,這是行不通的,因爲該指數值可以是在任務開始之前遞增。一個可能的解決方案可能是傳遞一個WaitHandle,它在增加索引之前等待並且必須通過DoJob方法發送信號,但是在我看來這並不是一個很好的解決方案。任何其他想法?

回答

15

值分配給在循環中一個臨時變量:

int index = 0; 
Task[] tasks; 
while(/*condition*/) 
{ 
    int value = index; 
    tasks[index] = Task.Factory.StartNew(() => DoJob(value)); 
    index++; 
} 

這樣,每個任務都會有自己的價值副本indexwhile循環的迭代中調用StartNew期間曾是製作。

+0

重構可能並不總是這樣直截了當,但應該始終可能 - 不要在嵌套循環中停頓:] – 2013-08-18 00:43:22