foreach循环中的委托和调度程序无法访问当前项

时间:2011-11-11 02:26:57

标签: c# wpf delegates dispatcher

我正在尝试在WPF中实现进度条。我循环遍历文件路径列表(List)并对文件执行一些操作。我想跟踪进程的进度,但它无法正常工作。在这种情况下,每次调用方法tagAndMoveFiles()时,都会使用foreach列表中的相同项调用它,但会调用适当的次数。我对代表不太好(显然)......我已经包含了所有相关代码。谢谢你的帮助。 (uploadProgress是进度条)


        uploadProgress.Maximum = impJob.SourceFilePaths.Count;
        DispatcherTimer timer = new DispatcherTimer();
        int progress = 0;
        foreach (string sourcefilepath in impJob.SourceFilePaths)
        {
            Thread t = new Thread(new ThreadStart(
            delegate()
            {
                    uploadProgress.Dispatcher.BeginInvoke(DispatcherPriority.Loaded,
                    new Action(
                        delegate
                            {
                                tagAndMoveFiles(sourcefilepath, targetFolder, impJob, sourceFileProcessed);
                                uploadProgress.Value = ++progress;
                                Thread.Sleep(100);
                            }
                        ));
            }
            ));
            t.Start();
        }

2 个答案:

答案 0 :(得分:4)

委托每次循环捕获相同的实例。所以你需要在循环中添加一个局部变量,就像这样......

foreach(string sourcefilepath in impJob.SourceFilePaths)
{
    string x = sourcefilepath;
    ...
        {
            tagAndMoveFiles(x, ...
        }
    ....
}

答案 1 :(得分:1)

您遇到了这个问题:Access to Modified Closure (2)

简短:您需要在foreach循环中包含一个局部变量来捕获sourcefilepath并将其传递给代理。