在阅读帖子Starting Tasks In foreach Loop Uses Value of Last Item)时,标记的答案很有意义。作者创建了一个新变量pathCopy,用于任务中。我的问题是,仅在使用Task.ContinueWith()时才需要这样做吗?
这里是一个例子:
private void GetAuditFiles()
{
_auditFiles = new ConcurrentBag<AuditFile>();
var tasks = new List<Task>();
foreach (var auditFile in Directory.GetFiles(_properties.AuditFileOutputPath))
{
var taskfile = auditFile;
tasks.Add(Task.Factory.StartNew(() =>
{
var file = DeserializeProcessProperties<AuditFile>(File.ReadAllText(taskfile));
file.filename = Path.GetFileName(taskfile);
_auditFiles.Add(file);
}));
}
Task.WaitAll(tasks.ToArray());
}
我是否需要设置像这样的变量“ var taskfile = auditFile;”?
注意:我正在使用VS 2017及其C#编译器的更新版本。
答案 0 :(得分:0)
好,感谢damien-the-unbeliever,感谢我指出Eric Lippert's Blog: closing over the loop variable part two。
如果我是c#v 4.0或更早版本,那么简短的答案是肯定的。在c#5.0或更高版本中,无论如何都不需要它。