我在每个阶段使用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();
}
答案 0 :(得分:1)
你可能正在寻找TPL Dataflow。应该从单个线程写入文件,直到它关闭。 TPL数据流可以轻松地将您的写请求汇集到同一个线程上。
看起来你正在使用WCF。如果您有多个线程的请求,并且您希望将它们记录到同一个文件中,则可以使用TPL Dataflow将它们汇集到其中。
答案 1 :(得分:1)
这可能不会起作用,因为XmlDocument
和XmlNode
以及所有相关类型都不是线程安全的。试图并行化写作可能会导致问题。