Если сторонний компонент не поддерживает стандартную модель асинхронного программирования (т.е. он не использует IAsyncResult), вы все равно можете добиться синхронизации, используя AutoResetEvent или ManualResetEvent. Для этого объявите поле типа AutoResetEvent в своем классе веб-службы:
AutoResetEvent processingCompleteEvent = new AutoResetEvent();
Затем дождитесь сигнала о событии после вызова стороннего компонента
// call 3rd party component
processingCompleteEvent.WaitOne()
И в обработчике события обратного вызова сигнализируют событие, чтобы позволить ожидающему потоку продолжить выполнение:
processingCompleteEvent.Set()