Делегат и диспетчер в цикле foreach не могут получить доступ к текущему элементу - PullRequest
1 голос
/ 11 ноября 2011

Я пытаюсь реализовать индикатор прогресса в 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 ]

4 голосов
/ 11 ноября 2011

Делегат захватывает один и тот же экземпляр каждый раз в цикле.Так что вам нужно добавить локальную переменную внутри цикла, как это ...

foreach(string sourcefilepath in impJob.SourceFilePaths)
{
    string x = sourcefilepath;
    ...
        {
            tagAndMoveFiles(x, ...
        }
    ....
}
1 голос
/ 11 ноября 2011

Вы столкнулись с этой проблемой: Доступ к измененному замыканию (2)

Short: вам нужно иметь локальную переменную внутри цикла foreach для захвата sourcefilepath ипередать это делегату.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...