是否可以使用PLINQ来写XmlWriter?任何其他流/写入器

本文关键字:其他 任何 可以使 PLINQ 来写 XmlWriter 是否 | 更新日期: 2023-09-27 18:14:29

我在每个阶段都使用PLINQ,但生成XML输出。我试过了,得到了一些奇怪的例外。所以我想知道是否有一个技巧可以让我做异步输出。

...
    [DataContract(Namespace = "")]
    public class MyClass
    {
        [DataMember]
        public ulong Id { get; set; }
        [DataMember]
        public int[] Value { get; set; }
    }
...
        private static readonly DataContractSerializer _serializer =
            new DataContractSerializer(typeof(MyClass));
...
            XmlDocument _resultDoc = new XmlDocument();
...
            using (var writer = _resultDoc.CreateNavigator().AppendChild())
            {
                writer.WriteStartElement("root");
                writer.WriteAttributeString("ver", "0");
                {
                    //--------------------------------------------------
                    // Want this to be:
                    // myDictionary.ToList().ToParallel().ForAll(pair =>
                    //--------------------------------------------------
                    myDictionary.ToList().ForEach(pair =>
                        _serializer.WriteObject(
                            writer, 
                            new MyClass 
                            {
                                Id = pair.Key.Id,
                                Value = pair.Value.ToArray()
                            }
                        )
                    );
                }
                writer.WriteEndElement();
            }

是否可以使用PLINQ来写XmlWriter?任何其他流/写入器

这不太可能起作用,因为XmlDocumentXmlNode以及所有相关类型都不是线程安全的。尝试并行写入可能会导致问题。

您可能正在寻找TPL数据流。应该从一个线程写入文件,直到它被关闭。TPL数据流允许您轻松地将写请求汇集到同一个线程上。

看起来你正在使用WCF。如果您的请求到达多个线程,并且您希望将它们记录到同一个文件中,那么您可以使用TPL数据流将它们汇集在一起。

相关文章: