Asynchronous 无法使Task.WaitAll正常工作

Asynchronous 无法使Task.WaitAll正常工作,asynchronous,xamarin.forms,task,wait,Asynchronous,Xamarin.forms,Task,Wait,我正在尝试让Task.WaitAll工作,但我的代码从未通过WaitAll代码行。这很简单。在出现主页事件时,尝试对Web API进行两次调用。关于我做错了什么有什么建议/想法吗 下面是我的页面的OnAppearing事件中的代码 protected override void OnAppearing() { try { base.OnAppearing(); List<Task<Strin

我正在尝试让Task.WaitAll工作,但我的代码从未通过WaitAll代码行。这很简单。在出现主页事件时,尝试对Web API进行两次调用。关于我做错了什么有什么建议/想法吗

下面是我的页面的OnAppearing事件中的代码

   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);
        }
    }
protected override void OnAppearing()
{
尝试
{
base.OnAppearing();
List lobj_TaskList=新列表();
WebAPICaller lobj_WebAPICaller=新的WebAPICaller();
Debug.WriteLine(“进程启动”);
lobj_TaskList.Add(lobj_WebAPICaller.httpgetwebservicecasync(“/DOW/EN”);
lobj_TaskList.Add(lobj_WebAPICaller.httpgetwebservicecasync(“/languages/true”);
Task.WaitAll(lobj_TaskList.ToArray());
}
捕获(例外情况除外)
{
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;
    }

}
}
使用系统;
使用系统诊断;
使用System.Net.Http;
使用System.Threading.Tasks;
使用Xamarin.Forms;
命名空间TestWebAPI
{
公共类WebapCaller:IDisposable
{
HttpClient iobj_HttpClient=null;
公共空间处置()
{
if(iobj_HTTPClient!=null)
iobj_HTTPClient.Dispose();
}
公共异步任务HTTPGetWebServiceAsync(字符串ps_URI)
{
字符串ls_Response=“”;
字符串ls_JSONData=“”;
字符串ls_前缀=”;
尝试
{
iobj_HTTPClient=wait GetClient();
交换机(设备运行时平台)
{
case设备。Android:
ls_Prefix=App.apisStandardPrefix;
打破
违约:
ls_Prefix=App.apisureprefix;
打破
}
WriteLine(“在api调用之前”);
iobj_HTTPClient.BaseAddress=新Uri(ls_前缀);
ls_JSONData=wait iobj_HTTPClient.GetStringAsync(ps_URI);
WriteLine(“在api调用之后”);
ls_Response=System.Net.WebUtility.HtmlDecode(ls_JSONData);
}
捕获(例外情况除外)
{
Debug.WriteLine(“api调用错误”);
App.ProcessException(ex);
}
返回ls_响应;
} 
专用异步任务GetClient()
{
HttpClient lobj_HttpClient=null;
if(lobj_HTTPClient==null)
{
lobj_HTTPClient=新的HTTPClient();
lobj_HTTPClient.DefaultRequestHeaders.Add(“Accept”、“application/json”);
lobj_HTTPClient.MaxResponseContentBufferSize=2147483647;
lobj_HTTPClient.Timeout=新的时间跨度(0,0,0,0,60000);
}
返回lobj_HTTPClient;
}
}
}

使用Task.whalll而不是Task.WaitAll

Wheall将等待所有任务完成。等待链将在第一个异常时中止等待,但继续执行未等待的任务。这会导致意外的并发

看看下面的代码,它将帮助你

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);
    }
}
protected async override void OnAppearing()
{
尝试
{
base.OnAppearing();
List lobj_TaskList=新列表();
WebAPICaller lobj_WebAPICaller=新的WebAPICaller();
Debug.WriteLine(“进程启动”);
lobj_TaskList.Add(lobj_WebAPICaller.httpgetwebservicecasync(“/DOW/EN”);
lobj_TaskList.Add(lobj_WebAPICaller.httpgetwebservicecasync(“/languages/true”);
wait Task.WhenAll(lobj_TaskList.ToArray());
}
捕获(例外情况除外)
{
App.ProcessException(ex);
}
}

这似乎允许代码在所有任务完成之前继续。我想等到它们全部完成。它是在等待所有任务完成。在任务之前添加等待。Wheall工作。谢谢