是否可以使用PLINQ来写XmlWriter?任何其他流/写入器
本文关键字:其他 任何 可以使 PLINQ 来写 XmlWriter 是否 | 更新日期: 2023-09-27 18:14:29
我在每个阶段都使用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();
}
这不太可能起作用,因为XmlDocument
和XmlNode
以及所有相关类型都不是线程安全的。尝试并行写入可能会导致问题。
您可能正在寻找TPL数据流。应该从一个线程写入文件,直到它被关闭。TPL数据流允许您轻松地将写请求汇集到同一个线程上。
看起来你正在使用WCF。如果您的请求到达多个线程,并且您希望将它们记录到同一个文件中,那么您可以使用TPL数据流将它们汇集在一起。