Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# XMLWriter与并行_C#_Parallel Processing_Xmlwriter - Fatal编程技术网

C# XMLWriter与并行

C# XMLWriter与并行,c#,parallel-processing,xmlwriter,C#,Parallel Processing,Xmlwriter,我有一组循环使用的数据库结果,我想将其写入XML。本质上,我有一个变量列表,其中每个变量都有一组属性(即,List,其中image有image.name、image.path、image.id等) 我想将每个图像的每个属性写入XML。我在平行循环中循环浏览图像列表。我是这样设置的: using(XMLWriter writer = XMLWriter.Create(outputfile) { Parallel.ForEach({ writer.Write

我有一组循环使用的数据库结果,我想将其写入XML。本质上,我有一个变量列表,其中每个变量都有一组属性(即,
List
,其中image有image.name、image.path、image.id等)

我想将每个图像的每个属性写入XML。我在平行循环中循环浏览图像列表。我是这样设置的:

    using(XMLWriter writer = XMLWriter.Create(outputfile)
    {
    Parallel.ForEach({
         writer.WriteStartElement("DOCUMENT");
         writer.WriteElementString("id", idvalue);
         writer.WriteElementString("name", namevalue);
         writer.WriteEndElement();

         writer.WriteStartElement("DOCUMENT");
         writer.WriteElementString("id", idvalue);
         writer.WriteElementString("path", pathvalue);
         writer.WriteEndElement();
});
    }
不管确切的语法是什么……我只是粗略地从我的头脑中进行说明,但我想把一堆元素写到一个文件中。我想知道并行线程是如何影响处理的。它似乎包含将元素写到一起的每个循环迭代;我有一半希望在整个输出文件中插入结束元素,但事实并非如此。MSDN说“此类型的任何公共静态(在Visual Basic中共享)成员都是线程安全的。任何实例成员都不保证是线程安全的。”但在引用WriteEndElement时,“关闭一个元素并弹出相应的命名空间范围。”


到目前为止,我是幸运的,因为它似乎能按顺序写出所有内容,还是XmlWriter实际上在WriteStarteElement和WriteEndElement之间有某种线程意识?我并不在乎元素本身的顺序,只要每个元素都写得正确。这两种方式都有真实的文档吗

这不是线程安全的,对于较大的数据集,可能会更明显地失败

但是,您不能期望这里的并行性有任何改进。您正在写入I/O设备,这是瓶颈,而不是CPU


因此,只需使用普通的
foreach(…)

“到目前为止,我很幸运,它似乎在写”—是的,你很幸运。谢谢你的确认。如果循环中也有一个数据库服务插入调用,这有关系吗?我们一直以这种方式运行它,直接进入数据库,但我们遇到了基础设施问题。所以我们想把输出的一部分转储到一个文件中,这样我们就可以大容量加载,而不是做一堆小的插入。无论如何,我可能会考虑删除并行性,但是如果我想保持这一点,我可以使用什么技术来并行创建/添加元素节点,但在每个循环中保持它们同步,并在最后写出它们?