Безопасен ли поток WCF MessageBuffer.CreateMessage? - PullRequest
0 голосов
/ 02 июня 2011

http://msdn.microsoft.com/en-us/library/system.servicemodel.channels.messagebuffer(v=vs.85).aspx несколько расплывчато, когда говорится, что «Любые открытые статические (Shared в Visual Basic) члены этого типа являются поточно-ориентированными. Любые члены экземпляра не гарантированно поточно-ориентированы».1004 *

Как правило, создается впечатление, что члены экземпляра не имеют поточно-ориентированной гарантии.

Однако я предполагаю, что некоторые методы-члены экземпляра являются реентерабельными и поточно-ориентированными, а другие - нет.

MessageBuffer.CreateMessage - это метод экземпляра.Кто-нибудь подтвердил, является ли этот конкретный метод реентерабельным (или нужно, чтобы вызывающие абоненты реализовывали блокировку вызовов метода)?

Ответы [ 2 ]

1 голос
/ 02 июня 2011

MessageBuffer.CreateMessage является абстрактным, поэтому нет смысла спрашивать, является ли он потокобезопасным или нет. Все подклассы MessageBuffer в WCF являются внутренними, поэтому их можно изменить. Как сказал Чандермани, вы должны предположить, что он не является потокобезопасным.

Обновление: не является потокобезопасным. Созданное сообщение может зависеть от других компонентов, таких как сериализация тела сообщения. Если эти компоненты не являются поточно-ориентированными, то вызов 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());
    }
}
1 голос
/ 02 июня 2011

Я не думаю, что пока не указана простота, методы экземпляра всегда не являются потокобезопасными. Вы можете посмотреть на этот метод через отражатель для подтверждения.
Кроме того, почему вы беспокоитесь о безопасности потоков этого метода? Какой у вас сценарий использования?

...