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

时间:2011-11-15 00:22:49

标签: c# .net xml linq plinq

我在每个阶段使用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();
            }

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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