С конкретным вариантом использования, который вы предоставляете, с одним асинхронным вызовом, оно того не стоит, но, да, вы можете вызывать асинхронные вызовы из веб-службы:
[WebMethod]
public SomeResult SynchronousMethod() {
IAsyncResult someWork = BeginSomeAsyncWork();
IAsyncResult otherWork = BeginOtherAsyncWork();
WaitHandle[] all = new WaitHandle[] { someWork.AsyncWaitHandle, otherWork.AsyncWaitHandle };
// TODO: Do some synchronous work here, if you need to
WaitHandle.WaitAll(all); /* this is the important part, it waits for all of the async work to be complete */
var someWorkResult = EndSomeAsyncWork(someWork);
var otherWorkResult = EndSomeAsyncWork(otherWork);
// TODO: Process the results from the async work
// TODO: Return data to the client
}
Важной вещью здесь является WaitHandle.WaitAll , которая будет блокировать, пока вся асинхронная работа не будет завершена. Если вы можете обрабатывать результаты по отдельности, вы можете использовать WaitHandle.WaitAny , но код становится более сложным и немного выходит за рамки вопроса.