System.Threading.Tasks in for循环问题

GET*_*Tah 4 c# multithreading task

由于以下问题,我正在撕掉我的头发.我有一些代码循环遍历对象列表并为每个对象创建一个处理任务.

        IList<TileInfo> tiles = tileSource.Schema.GetTilesInView(extent, level);
        List<Task> renderingTasks = new List<Task>();
        foreach (TileInfo info in tiles) {
            renderingTasks.Add(Task.Factory.StartNew(new Action(delegate {
                Console.WriteLine(Task.CurrentId +"Info object"+ info.GetHashCode());
                             }
                         })));
        }
Run Code Online (Sandbox Code Playgroud)

此代码打印:

1Info object36963566
2Info object36963566
3Info object36963566
4Info object36963566
5Info object36963566
6Info object36963566
7Info object36963566
8Info object36963566
9Info object36963566
10Info object36963566
11Info object36963566
12Info object36963566
...
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,问题是任务似乎都引用了一个对象!

为什么这些任务都只使用列表中的一个对象?

谢谢你的帮助

Ian*_*Ian 5

我会尝试在一瞬间添加更多细节,但这是关闭变量.将您的代码更改为:

基本上你需要做的是在循环中创建一个新变量,等于循环内部工作之外的单个声明.

IList<TileInfo> tiles = tileSource.Schema.GetTilesInView(extent, level);
List<Task> renderingTasks = new List<Task>();

foreach (TileInfo info in tiles) 
{
   TileInfo closingInfo = info;
   renderingTasks.Add(Task.Factory.StartNew(new Action(delegate {
                      Console.WriteLine(Task.CurrentId +"Info object"+ closingInfo.GetHashCode()); }})));
}
Run Code Online (Sandbox Code Playgroud)

阅读更多:

foreach标识符和闭包

http://blogs.msdn.com/b/ericlippert/archive/2009/11/12/closing-over-the-loop-variable-considered-harmful.aspx