Простое предоставление операции WCF с использованием асинхронной подписи (BeginBlah / EndBlah) фактически не влияет на отображаемую операцию. При просмотре метаданных такая операция, как
[OperationContract(AsyncPattern=true)]
IAsyncResult BeginSomething(AsyncCallback, object)
void EndSomething(IAsyncResult)
... на самом деле все равно в конечном итоге представляется как операция под названием «Нечто». И на самом деле это одна из приятных вещей в WCF: клиент и сервер могут различаться в зависимости от того, хотят ли они выполнять / использовать операцию синхронно.
Так что, если вы используете генерацию прокси WCF (например, через Add Service Reference), вы получите синхронные версии каждой операции независимо от того, реализованы они асинхронно или нет , если вы не отметите маленькую галочку для генерации асинхронного перегрузки. И когда вы это делаете, вы получаете асинхронные версии операций, которые могут быть объявлены только синхронно на сервере.
Все, что делает WCF на клиенте и на сервере, дает вам выбор модели потоков: хотите ли вы, чтобы WCF дождался результата, или вы собираетесь сообщить ему, что вы закончили. Насколько мне известно, то, каким образом осуществляется фактическое транспортное сообщение, совершенно не зависит. Например: для NetTcpBinding сокет все еще остается открытым на время вызова, в любом случае.
Итак, чтобы добраться до сути, я действительно изо всех сил пытаюсь представить, как это могло бы иметь какое-либо значение для защитной оболочки службы WCF. Если сервис предоставляется с использованием асинхронного шаблона и действительно реализован асинхронным способом (асинхронный для исходящего ввода-вывода, или очереди работают через пул потоков или что-то в этом роде), то, вероятно, есть аргумент, что усложнить DOS для службы будет труднее (путем исчерпав пул потоков WCF IO), но это было бы об этом.
См. Синхронные и асинхронные операции в MSDN
Примечание: если вы разделяете интерфейс контракта между клиентом и сервером, то, очевидно, синхронность двух концов совпадает (потому что они оба используют один и тот же тип интерфейса), но это всего лишь ограничение используя общий интерфейс. Если бы вы создали другой эквивалентный интерфейс, отличающийся только асинхронным шаблоном, вы все равно могли бы создать ChannelFactory для него просто отлично.