2016-11-17 2 views
0

Мне нужно позвонить в веб-службу, поэтому я добавил веб-сервис в качестве веб-ссылки, и я могу его назвать. Теперь мне нужно сделать этот вызов async, потому что ему нужно загрузить много данных, и это занимает много времени. Я попытался использовать метод async/await, но я не могу этого сделать, поскольку метод в веб-сервисе не является асинхронным.Вызов webservice асинхронно

Оригинальный код:

public static void validateLogin(JsonParameters _param, ref ValidateCredentials result, ref string excep_error) 
    { 
     var _mobileService = new MobileService(); 
     _mobileService.Url = AppParam.IISSTRING + "/UrlAddressReference"; 
     try 
     { 
      result = _mobileService.downloaddata(_param); 
     } 
     catch (Exception ex) 
     { 
      excep_error = ex.Message; 
     } 

    } 

Я пытался добавить задачу асинхронной вместо ничтожного сделать метод асинхра, но как я могу ждать ответ WebService?

После того как я добавил веб-сервис в качестве веб-ссылки, я вижу, что он создан для каждого метода в нем методом асинхронного и завершенного события. Как я могу их использовать? (Например: downloaddata", a method name downloaddataasync`, а также событие "downloaddatacompleted")

Есть ли способ сделать это или мне нужно изменить веб-сервис?

+1

Как выглядит реализация вызова «MobileService.downloaddata», потому что именно с этого и следовало бы начинать. –

ответ

0
public async static Task validateLogin(JsonParameters _param, ref ValidateCredentials result, ref string excep_error) 
     { 
      await Task.Run(()=> 
      { 
      var _mobileService = new MobileService(); 
      _mobileService.Url = AppParam.IISSTRING + "/UrlAddressReference"; 
      try 
      { 
       result = _mobileService.downloaddata(_param); 
      } 
      catch (Exception ex) 
      { 
       excep_error = ex.Message; 
      } 
     }); 
} 
+0

Интересно, что проголосовало за специально ... –

+0

Я тоже хотел бы знать –

+0

этот метод работает для меня спасибо –

0

Если вы хотите использовать асинхр/Await, правильный подход, как вы предложили: изменить validateLogin к public static async Task validateLoginAsync(...) Метод, который вызывает validateLogin должен быть изменен, и один называя его, и т.д.

Это может вы можете использовать AsyncContext или NotifyTaskCompletion в качестве костыля (от https://github.com/StephenCleary/AsyncEx/wiki/AsyncContext), но вам все равно может понадобиться использовать BackgroundWorker или аналогичную конструкцию.

1

После того, как я добавил веб-сервиса в качестве веб-ссылки на я могу увидеть, что она создана для каждого метода в нем метод асинхронной и завершил событие. Как я могу их использовать?

Это EAP членов. Вам нужно write TAP wrappers for those EAP members; то вы можете использовать async/await, как обычно.

Смежные вопросы