MessageBuffer.CreateMessage是抽象的,所以询问它是否线程安全没有意义。 WCF中的MessageBuffer的子类都是内部的,所以它们可能会被更改。正如Chandermani所说,你应该假设它不是线程安全的。
更新:它不是线程安全的。创建的消息可能依赖于其他组件,例如消息体的序列化。如果这些组件不是线程安全的,那么CreateMessage
调用也不能被认为是线程安全的。
在下面的例子中,对象的序列化版本是时间依赖的(它也可能有一些额外的依赖关系),所以CreateMessage
调用的顺序影响结果。
public class StackOverflow_6209650_751090
{
[DataContract]
public class MyDC
{
[DataMember]
public DateTime SerializedTime
{
get { return DateTime.Now; }
set { }
}
}
public static void Test()
{
Message message = Message.CreateMessage(MessageVersion.None, "foo", new MyDC());
var buffer = message.CreateBufferedCopy(int.MaxValue);
Console.WriteLine(buffer.CreateMessage());
Console.WriteLine();
Console.WriteLine(buffer.CreateMessage());
}
}
我们的服务维护多个MessageBuffers。这些缓冲区用于频繁创建消息。 我想避免每个CreateMessage调用的同步构造开销(除非,当然,CreateMessage调用不可重入) – ServerCode 2011-06-02 20:59:39
您将获得围绕创建消息添加同步构造的方法。 CreateMessage不会改变原始对象的状态,所以如果创建消息被调用一次或多次,它如何起作用。 – Chandermani 2011-06-03 04:22:38
如果该方法不可重入(如您所想的那样),则需要添加同步结构以确保该方法不会同时由两个不同线程执行 – ServerCode 2011-06-06 01:59:30