调用REST服务时如何处理超时问题。 我的GetAsync功能:
private async Task<string> GetAsync(string endPoint, string id)
{
using (var httpClient = new HttpClient())
{
SevenMResultNx<string> result = new SevenMResultNx<string>(false);
httpClient.BaseAddress = new Uri(baseAddress);
httpClient.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
httpClient.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue(token);
// HTTP GET
HttpResponseMessage response = await httpClient.GetAsync(String.Format("{0}/{1}", endPoint, id));
if (response.IsSuccessStatusCode)
{
return await response.Content.ReadAsStringAsync();
}
else
{
return response.ReasonPhrase;
}
}
}
被称为:
Task<string> task = GetAsync(endPoint, id);
var responseGet = task.Result;
每当端点不可用时,我就会遇到问题,因为进程等待无穷大。
答案 0 :(得分:2)
我建议您的方法接受CancellationToken
,然后您可以转到GetAsync
和ReadAsStringAsync
方法。
您可以轻松创建一个取消令牌,该令牌将在一段时间后过期:
var cts = new CancellationTokenSource(TimeSpan.FromSeconds(1));
var text = await GetAsync(endpoint, id, cts.Token);
此外,在呼叫者中使用Result
几乎肯定是一个错误。这意味着如果您正在使用具有单个线程的调度程序,那么您将陷入僵局 - 您的线程将等待任务完成,但它无法完成,因为{ {1}}调用完成后,需要在同一个线程中执行更多代码。两项改进:
httpClient.GetAsync
方法中,您正在等待任务,请使用GetAsync
,因为您可能不关心异步方法的其余部分在哪个线程上继续