http://msdn.microsoft.com/en-us/library/system.servicemodel.channels.messagebuffer(v=vs.85).aspx有点模糊,因为它说“这种类型的任何公共静态(在Visual Basic中共享)成员都是线程安全的。任何实例成员都不能保证是线程安全的。” I>
作为一般规则,似乎实例成员没有线程安全保证。
但是,我猜测某些实例成员方法是可重入且线程安全的,而其他方法则不是。
MessageBuffer.CreateMessage是一个实例方法。 是否有人确认此特定方法是否可重入(或者调用者是否需要实现对方法调用的锁定)?
答案 0 :(得分:1)
我不认为直到明确指定,实例方法总是非线程安全的。你可以通过反射器来看这个方法来确认 另外你为什么要关注这种方法的线程安全性?你的使用场景是什么?
答案 1 :(得分:1)
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());
}
}