0

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

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

但是,我猜一些实例成员方法是可重入的和线程安全的,而另一些则不是。

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

4

2 回答 2

1

我不认为在明确指定之前,实例方法总是非线程安全的。您可以通过反射器查看此方法来确认。
另外,您为什么担心这种方法的线程安全?你的使用场景是什么?

于 2011-06-02T04:23:31.767 回答
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());
    }
}
于 2011-06-02T07:34:55.883 回答