Parallel.ForEach问题 - 读写文件 - 文件正在使用错误

Sil*_*ght 2 c# file read-write windows-applications parallel.foreach

我真的很困惑Parallel.ForEach ...它是如何工作的?
下面的代码有错误 - >File Is In Use

Parallel.ForEach(list_lines_acc, (line_acc, list_lines_acc_state) =>
{
     FileStream file = 
         new FileStream(GPLfilePath, FileMode.Open, FileAccess.ReadWrite);
     StreamReader reader = new StreamReader(file);
     var processed = string.Empty;
     Ok_ip_port = string.Empty;
     while (reader.EndOfStream)
     {
         if (string.IsNullOrEmpty(Ok_ip_port))
         {
             Ok_ip_port = reader.ReadLine();
         }
         else
         {
             string currentLine = reader.ReadLine();
             processed += currentLine + Environment.NewLine;
         }
     }
     StreamWriter writer = new StreamWriter(file);
     writer.Write(processed);

     reader.Close();
     writer.Close();
     file.Close();
});  
Run Code Online (Sandbox Code Playgroud)

你能告诉我怎样才能解决这个问题?这段代码只是一个例子.

我想在Parallel.ForEach中使用字符串数组和列表,但是添加或编辑这些集合总是存在问题.你能举个例子吗?我使用的是Visual Studio 2010 + .NET Framework 4.0

Ree*_*sey 7

在您编写的代码中,每个线程使用相同的文件,并有效地尝试附加到它.即使这可以工作,你也会遇到一个糟糕的竞争条件(因为线程会尝试同时附加到同一个文件).

您看到的错误纯粹是因为您在每次循环迭代中使用相同的文件,所以当您尝试打开文件时(在第一次迭代之后),它会因为它被不同的循环迭代打开而出错.

此外,你永远不会使用你的循环变量(line_acc),所以根本不需要循环.这可以写成没有Parallel.ForEach,你有相同的结果,没有问题.

话虽如此 - 如果这是示例代码,您将倾向于发现纯粹由文件I/O绑定的循环将倾向于不能很好地并行化.正在使用的实际驱动器将成为限制因素,因此运行纯粹读取和写入文件的代码通常会导致生成的代码比顺序运行更慢,而不是更快.

我想在Parallel.ForEach中使用字符串数组和列表,但是添加或编辑这些集合总是存在问题

您作为示例显示的代码不执行任何操作,因此很难确定您的问题可能发生在何处.您可以写入数组或List<T>索引,但是如果没有额外的同步(例如a lock),List<T>则无法在并行循环中添加列表,因为写入不是线程安全的.如果您尝试从集合中读取和写入,则可以考虑查看System.Collections.Concurrent名称空间,该名称空间包含可以在Parallel.ForEach循环中安全使用的线程安全集合.