2013-07-10 4 views
-1

Что такое различие между:C# и Threadpool

Task[] tasks = new Task[mylist.Count]; 
int i = 0; 

foreach (DataTable dt in mylist) 
{ 
      Task t = Task.Factory.StartNew(() => UpdateProductsData(dt, updateType)); 
      tasks[i] = t; 
      i++; 
} 
Task.WaitAll(tasks); 

и:

tasks[0] = Task.Factory.StartNew(() => UpdateProductsData(mylist[0], updateType)); 
tasks[1] = Task.Factory.StartNew(() => UpdateProductsData(mylist[1], updateType)); 
tasks[2] = Task.Factory.StartNew(() => UpdateProductsData(mylist[2], updateType)); 
tasks[3] = Task.Factory.StartNew(() => UpdateProductsData(mylist[3], updateType)); 
Task.WaitAll(tasks); 

По какой-то причине первый фрагмент кода заканчивается преждевременно, хотя второй фрагмент ведет себя, как ожидалось. Что нужно изменить в первом примере, чтобы обеспечить динамическую реализацию?

+0

Невозможно рассказать без дополнительных контекстов и примеров. –

+0

@SimonWhitehead, но делает первый снипп точно так же, как второй, учитывая, что 'mylist' имеет 4 элемента? – user2490355

ответ

4

Это классический вопрос Captured Variable In Loop. Вам нужно скопировать значение вашего итератор петли локальной переменной внутри вашего тела цикла:

Task[] tasks = new Task[mylist.Count]; 
int i = 0; 
foreach (DataTable dt in mylist) 
{ 
    DataTable dtInner = dt; 
    Task t = Task.Factory.StartNew(() => UpdateProductsData(dtInner, updateType)); 
    tasks[i] = t; 
    i++; 
} 
Task.WaitAll(tasks); 

Edit:

Это может быть проще, чтобы выразить свой код в качестве однострочника использованием Parallel.Foreach:

Parallel.ForEach(mylist, dt => UpdateProductsData(dt, updateType));