C# 并行二进制序列化/反序列化(BinaryFormatter)。ForEach

C# 并行二进制序列化/反序列化(BinaryFormatter)。ForEach,c#,parallel-processing,C#,Parallel Processing,也许这是一个重复((但我还没有找到任何并行使用binnaryformatter.Foreach的示例代码。有人能提供一个示例吗? 代码示例 Parralel.ForEach(files, fileCurr=> { using(lib.Accesser("fileType", fileNameSpec)) { LoadFi

也许这是一个重复((但我还没有找到任何并行使用binnaryformatter.Foreach的示例代码。有人能提供一个示例吗? 代码示例

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

 }
}
}

你的问题之一是

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

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

如果你只是反序列化(只是从文件中读取),那就不同了

只读访问可以并行进行,因为它不需要按顺序锁定文件

见:

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

::编辑::

还有一件事:

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

如果要序列化多个对象,则需要将它们序列化为不同的文件…

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

这应该是这样的:

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

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

是否有任何原因导致序列化和/或反序列化在并行处理中出现问题?它是否取决于同一处理队列中的其他对象的属性?例如,您尝试了什么?我们可以看到一些示例代码吗?示例代码在哪里问题?有例外吗?只需将序列化代码放入类似serialize(xx)的方法中,并从并行forearch调用thius。只需确保它们不共享任何ResSources多个文件写入((我需要一个简单的示例,如何对读写进行sincronize)感谢您的明确答案,Timothy先生。问题是这个对象“objectForSerialization”只在这里创建((并且它没有传递给其他函数。你认为-在我的情况下,序列化这个对象有多可能?这对我来说很难说,因为我看不到
objectForSerialization
是什么类型,或者
loadObj(v)中到底发生了什么)
我确实注意到了另一件事,请看更新的答案哦,只是“Tim”很好:PI在这个项目中是新的,所以我只做了第一步,但是-objectForSerialization是一个非常大的类,有许多guid、字符串等字段-这是可以的。对于ManualResetEvent或SemaphoreSlim这样的字段,我使用[NonSerialized()].loadObj(v)-据我所知,它只是一个“构造函数”-它创建此objectForSerialization的新实例,并使用传入的“v”中的值设置它的一个字段,一些值按我所理解的默认值初始化。但我只尝试在二进制文件中序列化此对象