2016-11-17 99 views
0

我需要調用一個web服務,所以我添加了web服務作爲web引用,我可以調用它。現在我需要調用異步方式,因爲它需要下載大量數據,並且花費很多時間。我試圖使用async/await方法,但我無法做到這一點,因爲webservice中的方法不是異步的。異步調用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; 
     } 

    } 

我嘗試添加異步任務到位的空隙,使異步方法,但我怎麼能等待web服務的響應?

在我添加web服務作爲web引用後,我可以看到它爲其中的每個方法創建了一個異步方法和已完成的事件。我怎樣才能使用它們? (例如:downloaddata", a method name下載數據同步和一個事件「downloaddatacompleted」)

有沒有辦法做到這一點,或者我需要更改web服務?

+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需要改變的方法,和一個調用它,等

它可能您可以使用AsyncContextNotifyTaskCompletion作爲柺杖(來自https://github.com/StephenCleary/AsyncEx/wiki/AsyncContext),但您仍可能需要使用BackgroundWorker或類似構造。

1

後我加入web服務作爲Web參考值I可以看到,它在它的每個方法異步方法和完成事件創建。我怎樣才能使用它們?

那些是EAP成員。你需要write TAP wrappers for those EAP members;那麼你可以像正常一樣使用async/await