WCF MessageBuffer.CreateMessage线程是否安全?

时间:2011-06-02 01:59:07

标签: wcf thread-safety reentrancy

http://msdn.microsoft.com/en-us/library/system.servicemodel.channels.messagebuffer(v=vs.85).aspx有点模糊,因为它说“这种类型的任何公共静态(在Visual Basic中共享)成员都是线程安全的。任何实例成员都不能保证是线程安全的。” I>

作为一般规则,似乎实例成员没有线程安全保证。

但是,我猜测某些实例成员方法是可重入且线程安全的,而其他方法则不是。

MessageBuffer.CreateMessage是一个实例方法。 是否有人确认此特定方法是否可重入(或者调用者是否需要实现对方法调用的锁定)?

2 个答案:

答案 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());
    }
}