即使我设置了很长的超时,我在 client.PostAsyc 调用时也会收到 AggregateException。
这是我的代码。
try
{
StoresList objlist = new StoresList();
Windows.Storage.ApplicationDataContainer localSettings = Windows.Storage.ApplicationData.Current.LocalSettings;
Windows.Storage.ApplicationDataContainer session = Windows.Storage.ApplicationData.Current.RoamingSettings;
var contents = new FormUrlEncodedContent(new[]
{
new KeyValuePair<string, string>("userapi", session.Values["userapi"].ToString()),
new KeyValuePair<string, string>("keyapi", session.Values["keyapi"].ToString()),
new KeyValuePair<string, string>("notification_flag","1"),
new KeyValuePair<string, string>("token", localSettings.Values["deviceid"].ToString()),
});
using (var client = new HttpClient() { Timeout = TimeSpan.FromMinutes(4) } )
{
var result = client.PostAsync(session.Values["URL"] + "/abcd/", contents).Result;
if (result.IsSuccessStatusCode)
{
string data = result.Content.ReadAsStringAsync().Result;
if (data.Contains("activate") || data.Contains("enable"))
{
//Please activate the Mobile Assistant Extension
return null;
}
if (data != null)
{
List<Stores> objStores = JsonConvert.DeserializeObject<LoginResponse>(data).stores;
foreach (var item in objStores)
{
Stores objs = new Stores();
{
objs.id = item.id;
objs.name = item.name;
objlist.Add(objs);
}
}
}
}
}
return objlist;
}
catch (Exception ex)
{
throw ex;
return null;
}
有人可以建议如何管理这个问题吗?有时我会遇到 AggregateException。
我已经参考了以下链接,但仍然出现错误。事件我设置了超时。
将
async
添加到您的方法定义中,并使用 await
代替 .Result
。
使用
.Result
会阻塞线程,并且你会失去使用异步方法的所有好处。
使用
await
不仅可以“解开”数据,还可以解开异常(因此您将得到一个实际的异常,而不是 AggregateException)。
var result = await client.PostAsync(session.Values["URL"] + "/abcd/", contents);
...
string data = await result.Content.ReadAsStringAsync();
AggregateException 是执行异步任务时遇到的所有异常的集合。
如果你只是想检查遇到的异常是什么而不做任何处理,你可以这样做:
catch (AggregateException ae)
{
// This will just throw the first exception, which might not explain everything/show the entire trace.
throw ae.InnerException
}
或
catch (AggregateException ae)
{
// This will flatten the entire exception stack to a string.
throw new Exception(ae.ToString())
}