2017-11-02 29 views
0

私はTask.WaitAllを動作させようとしていますが、私のコードはWaitAllコード行を決して通過しません。それはかなり簡単です。 OnメインページのAppearingイベントで、Web APIを2回呼び出そうとします。私が間違っていることに関する提案/アイデアはありますか?以下はTask.WaitAllを動作させることができません

コードはここ

protected override void OnAppearing() 
    { 
     try 
     { 
      base.OnAppearing(); 
      List<Task<String>> lobj_TaskList = new List<Task<String>>(); 
      WebAPICaller lobj_WebAPICaller = new WebAPICaller(); 
      Debug.WriteLine("Process StartUp"); 

      lobj_TaskList.Add(lobj_WebAPICaller.HTTPGetWebServiceAsync("/DOW/EN")); 
      lobj_TaskList.Add(lobj_WebAPICaller.HTTPGetWebServiceAsync("/languages/true")); 

      Task.WaitAll(lobj_TaskList.ToArray()); 
     } 
     catch (Exception ex) 
     { 
      App.ProcessException(ex); 
     } 
    } 

がWebAPICallerクラス

using System; 
using System.Diagnostics; 
using System.Net.Http; 
using System.Threading.Tasks; 
using Xamarin.Forms; 

namespace TestWebAPI 
{ 
public class WebAPICaller : IDisposable 

{ 
    HttpClient iobj_HTTPClient = null; 
    public void Dispose() 
    { 
     if (iobj_HTTPClient != null) 
      iobj_HTTPClient.Dispose(); 

    } 

    public async Task<string> HTTPGetWebServiceAsync(string ps_URI) 
    { 

     string ls_Response = ""; 
     string ls_JSONData = ""; 
     string ls_Prefix = ""; 

     try 
     { 
      iobj_HTTPClient = await GetClient(); 

      switch (Device.RuntimePlatform) 
      { 
       case Device.Android: 
        ls_Prefix = App.APIStandardPrefix; 
        break; 
       default: 
        ls_Prefix = App.APISecurePrefix; 
        break; 
      } 

      Debug.WriteLine("before api call"); 
      iobj_HTTPClient.BaseAddress = new Uri(ls_Prefix); 
      ls_JSONData = await iobj_HTTPClient.GetStringAsync(ps_URI); 
      Debug.WriteLine("after api call"); 
      ls_Response = System.Net.WebUtility.HtmlDecode(ls_JSONData); 

     } 
     catch (Exception ex) 
     { 
      Debug.WriteLine("api call error"); 
      App.ProcessException(ex); 
     } 
     return ls_Response; 

    } 

    private async Task<HttpClient> GetClient() 
    { 
     HttpClient lobj_HTTPClient = null; 

     if (lobj_HTTPClient == null) 
     { 
      lobj_HTTPClient = new HttpClient(); 
      lobj_HTTPClient.DefaultRequestHeaders.Add("Accept", "application/json"); 
      lobj_HTTPClient.MaxResponseContentBufferSize = 2147483647; 
      lobj_HTTPClient.Timeout = new TimeSpan(0, 0, 0, 0, 60000); 
     } 

     return lobj_HTTPClient; 
    } 

} 
} 

答えて

1

使用Task.WhenAll代わりのTask.WaitAll

である私のページのOnAppearingイベントであります

すべてのタスクが完了するまで待ちます。待っているチェーンは、最初の例外を待って中止されますが、待たれていないタスクの実行が続けられます。これにより予期しない同時実行が発生します。

コードをご覧ください。お手数ですが、

protected async override void OnAppearing() 
{ 
    try 
    { 
     base.OnAppearing(); 
     List<Task<String>> lobj_TaskList = new List<Task<String>>(); 
     WebAPICaller lobj_WebAPICaller = new WebAPICaller(); 
     Debug.WriteLine("Process StartUp"); 

     lobj_TaskList.Add(lobj_WebAPICaller.HTTPGetWebServiceAsync("/DOW/EN")); 
     lobj_TaskList.Add(lobj_WebAPICaller.HTTPGetWebServiceAsync("/languages/true")); 

     await Task.WhenAll(lobj_TaskList.ToArray()); 
    } 
    catch (Exception ex) 
    { 
     App.ProcessException(ex); 
    } 
} 
+0

これは、すべてのタスクが完了する前にコードを続行できるようにします。私は彼らがすべて完了するまで待っています。 –

+0

すべてのタスクが完了するのを待っています。 –

+0

Task.WhenAllが機能する前に待機を追加する。ありがとう –

関連する問題