Существует шаблон, поддерживаемый WCF, для вызова с асинхронным вызовом begin и соответствующим вызовом end .
В этом случае асинхронные методы будут в интерфейсе клиента следующим образом:
[ServiceContract]
interface GeocodeService
{
// Synchronous Operations
[OperationContract(AsyncPattern = false, Action="tempuri://Geocode", ReplyAction="GeocodeReply")]
GeocodeResults Geocode(GeocodeRequestType geocodeRequest);
// Asynchronous operations
[OperationContract(AsyncPattern = true, Action="tempuri://Geocode", ReplyAction="GeocodeReply")]
IAsyncResult BeginGeocode(GeocodeRequestType geocodeRequest, object asyncState);
GeocodeResults EndGeocode(IAsyncResult result);
}
Если вы создадите интерфейс клиента с помощью svcutil с опцией асинхронных вызовов, вы получите все это автоматически.Вы также можете вручную создать клиентский интерфейс, если не используете автоматическую генерацию клиентских прокси.
Вызов End будет блокироваться до завершения вызова.
IAsyncResult asyncResult = geocodeService.BeginGeocode(geocodeRequest, null);
//
// Do something else with your CPU cycles here, if you want to
//
var geocodeResponse = geocodeService.EndGeocode(asyncResult);
Я не знаю, что вы сделали с вашими объявлениями интерфейса, чтобы получить функцию GeocodeAsync, но если вы сможете вернуть ее обратно в этот шаблон, ваша работа будет проще.