Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# for循环问题中的System.Threading.Tasks_C#_Multithreading_Task - Fatal编程技术网

C# for循环问题中的System.Threading.Tasks

C# for循环问题中的System.Threading.Tasks,c#,multithreading,task,C#,Multithreading,Task,因为下面的问题,我非常生气。我有一段代码,它循环遍历对象列表,并为每个对象创建一个处理任务 IList<TileInfo> tiles = tileSource.Schema.GetTilesInView(extent, level); List<Task> renderingTasks = new List<Task>(); foreach (TileInfo info in tiles) {

因为下面的问题,我非常生气。我有一段代码,它循环遍历对象列表,并为每个对象创建一个处理任务

        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());
                             }
                         })));
        }
正如您所看到的,问题在于任务似乎都引用了一个对象

为什么所有任务都只使用列表中的一个对象


感谢您的帮助

我稍后会尝试添加更多细节,但这是关于结束变量的。将代码更改为:

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

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()); }})));
}
IList tiles=tileSource.Schema.GetTilesInView(范围、级别);
List renderingTasks=新建列表();
foreach(平铺中的平铺信息)
{
TileInfo closingInfo=信息;
renderingTasks.Add(Task.Factory.StartNew)(新操作(委托{
Console.WriteLine(Task.CurrentId+“Info object”+closingininfo.GetHashCode();}}});
}
欲了解更多信息:


对象36963566
必须是平铺列表中的最后一个实例

这是因为在.Net的当前实现中,
foreach
是如何工作的。虽然将来会修好的

您需要阅读以了解foreach在这种情况下是如何工作的

Task.CurrentId+“信息对象”+Info.GetHashCode()


上述代码中的
info
指的是列表中的项目
tiles
。您正在创建的
委托
将不会使用创建委托时引用的项目
info
。相反,它将使用
info
(方法/委托实际运行时info所指向的值)的当前值,该值显然指向列表的最后一项。这就是为什么你会有这种行为

这解决了问题!谢谢
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()); }})));
}