我想迭代一批请求,使用HttpClient类将每个请求发送到外部API。
foreach (var MyRequest in RequestsBatch)
{
try
{
HttpClient httpClient = new HttpClient();
httpClient.Timeout = TimeSpan.FromMilliseconds(5);
HttpResponseMessage response = await httpClient.PostAsJsonAsync<string>(string.Format("{0}api/GetResponse", endpoint), myRequest);
JObject resultResponse = await response.Content.ReadAsAsync<JObject>();
}
catch (Exception ex)
{
continue;
}
}
这里的背景是我需要设置一个非常小的超时时间,以便在响应时间超过该时间后,我们将简单地获得“任务已取消”异常并继续迭代。
现在,在上面的代码中,请注释掉这两行:
HttpResponseMessage response = await httpClient.PostAsJsonAsync<string>(string.Format("{0}api/GetResponse", endpoint), myRequest);
resultResponse = await response.Content.ReadAsAsync<JObject>();
循环非常快。取消注释并再次尝试。这需要很长时间。
我想知道使用await调用PostAsJsonAsync/ReadAsAsync方法是否比超时值需要更长的时间?
根据下面的答案,假设它将创建不同的线程,我们有这个方法:
public Task<JObject> GetResponse(string endPoint, JObject request, TimeSpan timeout)
{
return Task.Run(async () =>
{
try
{
HttpClient httpClient = new HttpClient();
httpClient.Timeout = TimeSpan.FromMilliseconds(5);
HttpResponseMessage response = await httpClient.PostAsJsonAsync<string>(string.Format("{0}api/GetResponse", endPoint), request).WithTimeout<HttpResponseMessage>(timeout);
JObject resultResponse = await response.Content.ReadAsAsync<JObject>().WithTimeout<JObject>(timeout);
return resultResponse;
}
catch (Exception ex)
{
return new JObject() { new JProperty("ControlledException", "Invalid response. ")};
}
});
}
在那里会引发一个异常,应返回JObject异常,但是如果使用httpClient方法,即使它引发异常,也需要很长时间。是否有在幕后处理影响任务的处理方式,即使返回值只是简单的异常JObject?
如果是,还有哪些其他方法可以以非常快的方式发送一批请求到API?