将超时添加到任务

时间:2018-01-30 15:45:22

标签: c# xamarin

我正在调用一个Web服务,该服务将返回我打算放入移动应用程序的SQLite数据库中的数据。问题是该服务需要一些时间来返回数据,并且应用程序执行超时并失败。

如何在HelperFile中合并任务以确保它成功返回到调用函数?

protected async override void OnAppearing()
    {
        base.OnAppearing();
        await Task.Run(async () =>
        {
            await ProcessData();
        });

    }

    private async Task ProcessData()
    {

        HelperFile myHelper = new HelperFile();

        //Pass Information to Webservice
        Uri jsonUrl1 = new Uri(string.Format("https://www.myURL.com/page.asmx/GetMyData"));


        var result = await myHelper.GetResponseString(jsonUrl1);
        //JObject rss = JObject.Parse(result);

       jsonCredit_Union.RootObject obj = JsonConvert.DeserializeObject<jsonCredit_Union.RootObject>(result);

        foreach (KeyValuePair<string, jsonCredit_Union.JobCode> kvp in obj.Results.JobCodes)
        {
            using (SQLiteConnection conn = new SQLiteConnection(App.DB_PATH))
            {
                tblCredit_Union tcu = new tblCredit_Union()
                {
                    cuName = kvp.Value.cuName,
                    cuPhone = kvp.Value.cuPhone,
                    address1 = kvp.Value.address1,
                    city = kvp.Value.city,
                    state_id = kvp.Value.state_id,
                    zip_Code = kvp.Value.zip_Code,
                    longitude = kvp.Value.longitude,
                    latitude = kvp.Value.latitude
                };

                conn.CreateTable<tblcredit_union>();
                conn.Insert(tcu);

            }
        }
    } 

这是失败的地方并返回“任务已取消”。由于超时,我无法检查ResponseCode。

    public class HelperFile
{
    //Returns a json recordset from a provided URL
    public async Task<string> GetResponseString(Uri url)
    {
        try
        {
            using (HttpClient client = new HttpClient())
            {
                using (HttpResponseMessage response = await client.GetAsync(url))
                {
                    if (response.IsSuccessStatusCode)
                    {
                        using (HttpContent content = response.Content)
                        {
                            string myContent = await content.ReadAsStringAsync();
                            return myContent;
                        }
                    }
                    else
                    {
                        return "Error";
                    }
                }

            }
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }

1 个答案:

答案 0 :(得分:1)

要考虑的一件事是,您的应用程序作为客户端无法确保服务器成功返回您的呼叫。如果注释时间太长,可以在助手类中设置HttpClient的超时。

现在,您在帮助程序中有一个try catch,但在ProcessData()调用中没有。因此,当任务超时并抛出异常时,您的应用可能会崩溃。您可以使用网络调节器或将设备/模拟器置于飞行模式进行测试。

另一种情况是您调用服务器并返回非成功状态代码。现在,您返回一个"Error"字符串 - 但ProcessData()

中未解决此返回值

一个起点可能是将Try / Catch移出你的助手并进入后面的代码(xaml.cs文件)。另一个想法可能是将序列化移动到你的Helper类......希望这有助于指出你正确的方向。