0

也许这是一个重复((但我没有找到任何在 Parallel.Foreach 中使用 binnaryformatter 的示例代码。有人可以提供它的示例吗?代码示例

Parralel.ForEach(files, fileCurr=>
                  {
                      using(lib.Accesser("fileType", fileNameSpec))
                      {
                        LoadFileData(fileNameSpec,fileCurr,cancellationToken, progressCallback);
                      }
                   });
and

LoadFileData(fileNameSpec,fileCurr,cancellationToken, progressCallback)
{
 using(lib2.load(fileCurr.name))
{
 foreach(var v in fileCurr.include)
 {
   var objectForSerialization = loadObj(v);
   //my code goes below
   System.IO.Stream stream = System.IO.File.Open("J:\\volume", FileMode.OpenOrCreate);
                    System.Runtime.Serialization.Formatters.Binary.BinaryFormatter bformatter = new BinaryFormatter();
                    bformatter.Serialize(stream, objectForSerialization);
                    stream.Close();
  //but this fil will be locked by multyply writes

 }
}
}
4

1 回答 1

1

你的问题的一部分是

在同一个文件中并行读取和写入或执行多个写入实际上是不可能的。

一旦为文件读/写实现了锁定机制,就不再需要并行执行迭代,因为它的操作不能并行执行

如果您只是反序列化,(只是从文件中读取)这是一个不同的故事。

只读访问可以并行完成,因为它不需要锁定文件本身。

请参阅:如何在不锁定的情况下读取文本文件?

您可以做的另一件事是预加载文本文件(如果可能的话)并直接从结果字符串中反序列化它们。

::编辑::

还有一件事 :

您似乎总是在写入 J:驱动器上的同一个文件(一个volume没有扩展名的文件)。

如果您正在序列化多个对象,您将希望它们被序列化为不同的文件......

如果您可以确保所有对象都被序列化为不同的文件,那么您可以使操作并行。

这将是这样的:

 System.IO.Stream stream = System.IO.File.Open("J:\\volume\\" + GenerateFileName(v), FileMode.OpenOrCreate);

然后确保 GenerateFileName 生成一个唯一的文件名作为字符串。

于 2013-02-21T10:59:14.310 回答