Как уже отмечали другие, взглянуть на часть вашего кода поможет. Но кое-что нужно проверить:
(1) Отключите «Включить только мой код» в разделе «Отладка / Параметры / Отладка / Общие» и установите некоторые точки останова в файле Reference.cs, чтобы увидеть, получают ли попадание какие-либо низкоуровневые методы обратного вызова.
(2) Подтвердите, что вы устанавливаете обработчики завершенных событий и в правой части прокси-клиента. Если вы устанавливаете обработчики событий для одного экземпляра и делаете вызов для другого, это может привести к описанному вами поведению.
(3) Поэкспериментируйте с MS Service Trace Viewer, как описано здесь , и посмотрите, есть ли какие-либо очевидные ошибки (обычно полезно выделены красным).
Скорее всего, есть другие вещи, которые вы могли бы проверить, но это займет вас на один день или около того: -).
(правки внесены после публикации кода)
(4) Возможно, вы захотите попробовать определить переменную ws на уровне класса, а не функции. Теоретически, если для него определен обработчик события, это означает, что он не будет собирать мусор, но это все же немного странно, поскольку, как только вы выходите из функции, у вас больше нет к нему дескриптора, и, следовательно, не может делать такие важные вещи, как, скажем, закрывать его.
(5) Если вы еще этого не сделали, попробуйте перестроить прокси-класс в диалоговом окне «Добавить ссылку на службу» в Visual Studio. Я видел случайную странную проблему, когда веб-сервис изменился незначительно, а клиент не был обновлен для отражения изменений: некоторые методы будут вызываться успешно, другие - нет.
(6) Если вы, вероятно, одновременно открываете несколько экземпляров прокси-клиента, рассмотрите возможность объединения их в один экземпляр (и используйте необязательный параметр "object userState" вызова метода для передачи обратного вызова, так что вы не столкнетесь с неприятной возможностью назначения нескольких обработчиков событий). В прошлом я сталкивался с неприятными проблемами, когда несколько экземпляров наступали друг на друга, и в настоящее время я рекомендую структурировать мой код таким образом, чтобы в каждый момент времени был открыт только один экземпляр клиента. Я знаю, что это не обязательно то, что говорит MS, но это был мой опыт.