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,并且所有线程都将具有自己的值,其他线程不能乱用.那应该可以解决您的问题。
首先,我为标题道歉,我不确定如何表达这个问题。
我目前有一个 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,并且所有线程都将具有自己的值,其他线程不能乱用.那应该可以解决您的问题。