Клиентские заглушки .NET WSE поточно-ориентированы? - PullRequest
3 голосов
/ 23 декабря 2009

Сгенерированы ли клиентские заглушки из WSDL потокобезопасным .NET WSE?

Конечно, «потокобезопасный» не обязательно является строго определенным термином, поэтому меня по крайней мере интересует следующее:

Доступны ли разные экземпляры одного и того же класса-заглушки для разных потоков одновременно с таким же эффективным поведением, что и однопоточное выполнение?

Является ли один экземпляр одного и того же класса-заглушки доступным одновременно различным потокам с таким же эффективным поведением, как и те же вызовы, чередующиеся каким-либо произвольным образом в однопоточном выполнении?

Вы также можете использовать терминологию, описанную здесь (и начинающуюся здесь ), чтобы обсудить это более точно.

1 Ответ

2 голосов
/ 23 декабря 2009

Ну, для краткого ответа это потокобезопасно, да. Причина в том, что на стороне сервера службы будет больше информации, чем о клиентских подключениях, о возможностях потоков. Клиент - это просто прокси, который выкладывает запрос так, чтобы сервер мог его понять. Ничего не знает Это базовый класс, нет внешнего доступа, кроме подключения к серверу. Так что, пока сервер допускает несколько соединений, у вас все будет в порядке. Таким образом, нет конфликта ресурсов (за исключением того, что сервер может обрабатывать все ваши запросы).

На стороне клиента вы можете иметь несколько потоков, использующих один и тот же класс, но разные экземпляры. Это, вероятно, будет предпочтительным сценарием, так что каждая транзакция может быть атомарной. В то время как совместно используемый экземпляр вам придется обрабатывать собственный поток, блокирующий доступ самого класса, в противном случае вы можете столкнуться с состоянием гонки на внутреннем ресурсе вашего кода.

Существует также возможность асинхронного вызова. Заглушки, сгенерированные утилитой wsdl, создадут методы start, end invoke, чтобы вы могли предоставить метод обратного вызова, чтобы эффективно позволить вам отправить запрос и продолжить код, не ожидая ответа. Это, вероятно, будет лучшим для вашего второго сценария с одним экземпляром.

Однако это также зависит от того, как кодируется серверный компонент. Если это веб-сервис, вы должны иметь возможность отправлять несколько запросов одновременно. Однако, если это сервис на основе сокетов, вам может потребоваться выполнить дополнительное кодирование на своем конце, чтобы обрабатывать несколько входящих соединений или даже создавать сокеты, например.

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

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

Причина, по которой я утверждаю ограничения сервера, заключается в том, что есть компании, которые будут создавать веб-службы, которые ограничивают количество подключений, исходящих от исходящих хостов, поэтому ваша пропускная способность ограничена этим. Таким образом, количество эффективных потоков, которые вы могли бы использовать, было бы уменьшено или устарело.

...