2017-11-02 3 views
0

Ich versuche, Task.WaitAll zu arbeiten, aber mein Code nie über die WaitAll-Codezeile. Es ist ziemlich einfach. On Appearing-Ereignis der Hauptseite versucht, einige Aufrufe von Web-APIs auszuführen. Irgendwelche Vorschläge/Ideen, was ich falsch mache?Kann Task.WaitAll nicht zum Arbeiten

Unten ist der Code in der OnAppearing Ereignis meiner Seite

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); 
     } 
    } 

Hier ist die WebAPICaller Klasse

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; 
    } 

} 
} 

Antwort

1

Verwenden Task.WhenAll statt Task.WaitAll,

WhenAll wird auf den Abschluss aller Aufgaben warten. Eine Kette von Warten würde die Wartezeit bei der ersten Ausnahme abbrechen, aber die Ausführung von nicht erwarteten Aufgaben wird fortgesetzt. Dies verursacht unerwarteten Nebenläufigkeit.

Schauen Sie unter Code, es wird Ihnen helfen.

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

Dies scheint zu ermöglichen, den Code fortzusetzen, bevor alle Aufgaben abgeschlossen sind. Ich möchte warten, bis alle fertig sind. –

+0

Es wartet auf alle Aufgaben abgeschlossen sind. –

+0

Hinzufügen der Wartezeit vor Task.WhenAll funktioniert. Vielen Dank –

Verwandte Themen