c#和Threadpool

时间:2013-07-10 03:49:02

标签: 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);

由于某种原因,第一个片段过早终止,尽管第二个片段的行为符合预期。在第一个例子中需要改变什么才能提供动态实现?

1 个答案:

答案 0 :(得分: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);

修改

使用Parallel.Foreach

将代码表示为单行可能更简单
Parallel.ForEach(mylist, dt => UpdateProductsData(dt, updateType));