2011-11-15 8 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を使用してファンドインすることができます。

関連する問題