簡體   English   中英

C#和線程池

[英]c# and 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);

由於某些原因,第一個代碼段會提前終止,盡管第二個代碼段的行為符合預期。 為了提供動態實現,在第一個示例中需要更改什么?

這是經典的“ 捕獲的循環變量”問題。 您需要將循環迭代器的值復制到循環體內的局部變量中:

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));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM