2011-11-15 17 views
1

我在每个阶段使用PLINQ,但生成一个XML输出。我尝试了一些古怪的例外。所以我想知道是否有一个技巧可以让我做异步输出。是否可以使用PLINQ写入XmlWriter?任何其他流/作家?

... 
    [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(); 
      } 
+0

究竟是什么例外,你在哪里得到它? –

回答

1

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

1

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

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

相关问题