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