我正在调用一个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;
}
}
答案 0 :(得分:1)
要考虑的一件事是,您的应用程序作为客户端无法确保服务器成功返回您的呼叫。如果注释时间太长,可以在助手类中设置HttpClient的超时。
现在,您在帮助程序中有一个try catch,但在ProcessData()
调用中没有。因此,当任务超时并抛出异常时,您的应用可能会崩溃。您可以使用网络调节器或将设备/模拟器置于飞行模式进行测试。
另一种情况是您调用服务器并返回非成功状态代码。现在,您返回一个"Error"
字符串 - 但ProcessData()
一个起点可能是将Try / Catch移出你的助手并进入后面的代码(xaml.cs文件)。另一个想法可能是将序列化移动到你的Helper类......希望这有助于指出你正确的方向。