C# 并行二进制序列化/反序列化(BinaryFormatter)。ForEach
也许这是一个重复((但我还没有找到任何并行使用binnaryformatter.Foreach的示例代码。有人能提供一个示例吗? 代码示例C# 并行二进制序列化/反序列化(BinaryFormatter)。ForEach,c#,parallel-processing,C#,Parallel Processing,也许这是一个重复((但我还没有找到任何并行使用binnaryformatter.Foreach的示例代码。有人能提供一个示例吗? 代码示例 Parralel.ForEach(files, fileCurr=> { using(lib.Accesser("fileType", fileNameSpec)) { LoadFi
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”中的值设置它的一个字段,一些值按我所理解的默认值初始化。但我只尝试在二进制文件中序列化此对象