В вашем методе вызовите сервисный вызов асинхронно и зарегистрируйте обратный вызов, который устанавливает флаг. После того, как вы вызвали метод, войдите в цикл «занят / ожидание», периодически проверяя флаг, пока не будет установлен флаг, указывающий, что данные были возвращены. Обратный вызов должен установить поле поддержки для вашего метода, и вы сможете вернуть его, как только обнаружите, что установлен флаг, указывающий на успех. Вы также должны быть обеспокоены неудачей. Если возможно получить несколько вызовов вашего метода из разных потоков, вам также потребуется использовать некоторую блокировку, чтобы сделать ваш код поточно-ориентированным.
EDIT
На самом деле, цикл занятости / ожидания, вероятно, не тот путь, если веб-служба поддерживает семантику BeginGetData / EndGetData. Я посмотрел на некоторый мой код, где я делаю что-то похожее, и я использую WaitOne, чтобы просто дождаться асинхронного результата и затем получить его. Если ваш веб-сервис не поддерживает это, тогда добавьте Thread.Sleep - скажем, на 50-100 мс - в цикл ожидания, чтобы дать время для выполнения других процессов.
Пример из моего кода:
IAsyncResult asyncResult = null;
try
{
asyncResult = _webService.BeginGetData( searchCriteria, null, null );
if (asyncResult.AsyncWaitHandle.WaitOne( _timeOut, false ))
{
result = _webService.EndGetData( asyncResult );
}
}
catch (WebException e)
{
...log the error, clean up...
}