Parallel.ForEach 没有准确地将数据存储在变量中

Parallel.ForEach not storing data in variable accurately

首先,我为标题道歉,我不确定如何表达这个问题。

我目前有一个 Parallel.ForEach 循环遍历一个充满 .txt 文件的目录。

我在其中所做的是获取与 file-to-file 不同的特定数据。

只要抓取了所有需要的数据,就会将其输出到文件中。

除了每个文本文件中的 ID 号外,一切都是准确的。 ID 号未与其对应的文件对齐。它以任意方式输出。名称和日期排列得很好,但不是文本文件中的实际 ID 号。我不确定如何进行此操作,因为代码对我来说看起来不错。我唯一能想到的是 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);
                }
            });
        });

您的问题是因为您使用了 Parallel.ForEach(),您发布的代码被不同线程同时 运行 多次。这对于更快地完成工作非常有用,但它可以让您了解一些方法。

您的变量 ID 未在您发布的代码中声明,这意味着它必须来自其他地方。这意味着您使用 Parallel.ForEach() 创建的所有线程都共享同一个变量,覆盖彼此的值,这就是您所看到的:写入文件的 ID 不是该文件的 ID ,它是最近碰巧触及该值的线程中的一个。

在您对 Parallel.ForEach() 的调用中 声明一个新变量 以用作 ID,并且所有线程都将具有自己的值,其他线程不能乱用.那应该可以解决您的问题。