Parallel.ForEach не хранит данные в переменной точно - PullRequest
0 голосов
/ 07 октября 2019

Прежде всего, я прошу прощения за заголовок, я не уверен, как сформулировать этот вопрос.

В настоящее время у меня Parallel.ForEach перебирает каталог, заполненный файлами .txt.

То, что я делаю внутри этого, захватывает определенные данные, которые варьируются от файла к файлу.

Всякий раз, когда все необходимые данные собираются, они затем выводятся в файл.

Все верно, кроме идентификационных номеров внутри каждого текстового файла. Идентификационные номера не совпадают с соответствующим файлом. Он выводится произвольным образом. Имена и дата располагаются в порядке, но не фактические идентификационные номера внутри текстовых файлов. Я не уверен, как поступить с этим, так как код выглядит хорошо для меня. Единственное, о чем я могу думать, это то, что AppendAllText постоянно открывает и закрывает окончательный текстовый файл, что, в свою очередь, не позволяет выводить точные данные. Ниже мой код.

        Parallel.ForEach(directoryInfo.GetFiles("*.txt"), (file, state) =>
        {
            using StreamReader sr = File.OpenText(file.FullName);
            string user = sr.ReadToEnd();
            if (user.Contains("ID:"))
            {
                ID = IDRegex.Match(user).Value.Replace("ID:", string.Empty);

            }
            else if (user.Contains("ID="))
            {
                ID = IDDRegex.Match(user).Value.Replace("ID=", string.Empty);
            }

            this.Dispatcher.Invoke(() =>
            {
                //count++;
                //Current.Content = file.Name;
                if (user.Contains(users.Text))
                {
                    File.AppendAllText(Idir + "IReport-" + IUser.Text + ".txt",
                                       String.Format("{0,-16} {1,27}", file.Name.Replace(".txt", ""), (file.LastWriteTime.Date).ToString()).Replace("12:00:00 AM", "") +
                                       String.Format("{0, 18}", ID) + Environment.NewLine + Environment.NewLine);
                }
            });
        });

1 Ответ

1 голос
/ 08 октября 2019

Ваша проблема в том, что, поскольку вы использовали Parallel.ForEach(), код, который вы опубликовали, выполняется несколько раз одновременно разными потоками. Это отлично подходит для выполнения работы быстрее, но может поймать вас несколькими способами.

Ваша переменная ID не объявлена ​​в опубликованном вами коде, что означает, что она должна быть откуда-то еще,Это означает, что все потоки, созданные при использовании Parallel.ForEach(), совместно используют одну и ту же переменную, перезаписывая значения друг друга, и это то, что вы видите: ID, записываемый в файл, не тот для этого файла, этоодин из тех потоков, которые случайно коснулись этого значения в последнее время.

Объявите новую переменную внутри вашего вызова Parallel.ForEach() для использования в качестве идентификатора, и все потоки будут иметь свое собственное значение, с которым другие не смогут связываться. Это должно исправить вашу проблему.

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