Безопасен ли поток SoapHttpClientProtocol?
Я создал прокси-сервер веб-службы с функцией "добавить веб-ссылку" в VS 2008 (C#).
Сгенерированный класс происходит от SoapHttpClientProtocol
Могу ли я хранить только один экземпляр моего прокси в синглтоне? Это потокобезопасно? Есть ли состояние между вызовами, которое помешало бы мне сделать это?
4 ответа
Нет, это не потокобезопасно. клиент должен быть в открытом состоянии, чтобы разрешить вызовы. Простой сценарий, когда один поток выполняет client.Close(), а другой пытается вызвать метод, завершится неудачей.
MSDN говорит, что SoapHttpClientProtocol является потокобезопасным:
Поток безопасности
Этот тип является потокобезопасным.
Для другого класса, такого как System.Windows.Forms, который не является потокобезопасным, MSDN говорит:
Поток безопасности
Любые открытые статические (Shared в Visual Basic) члены этого типа являются потокобезопасными. Любые члены экземпляра не гарантированно являются потокобезопасными.
Вот сотрудник Microsoft/MSDN, который говорит (хотя и без гарантии), что он потокобезопасен:
Привет Макс
Для прокси-сервера веб-сервиса, я думаю, он должен быть потокобезопасным, поскольку сгенерированный прокси-класс.NET является производным от класса "SoapHttpClientProtocol", который в документе помечен как потокобезопасный:
Класс SoapHttpClientProtocol
следовательно, это должно быть безопасно использовать его в многопоточном контексте, если вы не добавили вручную какой-либо контекстно-зависимый член в производный прокси-класс. Ты так думаешь?
С уважением,
Стивен Ченг
Microsoft MSDN Поддержка онлайн-лидер
Эта публикация предоставляется "КАК ЕСТЬ" без каких-либо гарантий и не дает никаких прав.
По этой ссылке: http://msdn.microsoft.com/en-us/library/system.web.services.protocols.soaphttpclientprotocol.aspx
внизу под надписью "Безопасность потоков" указано, что этот тип безопасен для потоков. Я, однако, не знаю, что использование его в качестве синглтона будет потокобезопасным.
MSDN не упоминает, что это потокобезопасный:
Поток безопасности
Этот тип является потокобезопасным.
Класс безопасен, никаких упоминаний об объекте.
Но можно с уверенностью сказать, что он не является потокобезопасным - ни один объект в библиотеке.NET не является потокобезопасным.
(По крайней мере, я никогда не видел)