1

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

2 回答 2

1

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

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

于 2011-11-15T00:26:23.493 回答
1

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

于 2011-11-15T00:29:14.233 回答