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

XmlDocumentXmlNode、および関連するすべての型はスレッドセーフではないため、これは機能しない可能性があります。書き込みを並列化しようとすると、問題が発生する可能性があります。

于 2011-11-15T00:29:14.233 に答える