不使用task.ContinueWith()时正在重新分配必要的任务值

时间:2018-11-14 15:42:50

标签: c# continuewith

在阅读帖子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#编译器的更新版本。

1 个答案:

答案 0 :(得分:0)

好,感谢damien-the-unbeliever,感谢我指出Eric Lippert's Blog: closing over the loop variable part two

如果我是c#v 4.0或更早版本,那么简短的答案是肯定的。在c#5.0或更高版本中,无论如何都不需要它。