我已经创建了一个类来处理多个HTTP GET请求。它看起来像这样:
public partial class MyHttpClass : IDisposable
{
private HttpClient theClient;
private string ApiBaseUrl = "https://example.com/";
public MyHttpClass()
{
this.theClient = new HttpClient();
this.theClient.BaseAddress = new Uri(ApiBaseUrl);
this.theClient.DefaultRequestHeaders.Accept.Clear();
this.theClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
}
public async Task<JObject> GetAsync(string reqUrl)
{
var returnObj = new JObject();
var response = await this.theClient.GetAsync(reqUrl);
if (response.IsSuccessStatusCode)
{
returnObj = await response.Content.ReadAsAsync<JObject>();
Console.WriteLine("GET successful");
}
else
{
Console.WriteLine("GET failed");
}
return returnObj;
}
public void Dispose()
{
theClient.Dispose();
}
}
然后我通过在Task.Run()上使用循环然后在Task.WaitAll()之后以下列方式对多个requets进行排队:
public async Task Start()
{
foreach(var item in list)
{
taskList.Add(Task.Run(() => this.GetThing(item)));
}
Task.WaitAll(taskList.ToArray());
}
public async Task GetThing(string url)
{
var response = await this.theClient.GetAsync(url);
// some code to process and save response
}
它确实比同步操作更快地工作,但它没有我预期的那么快。根据其他建议,我认为本地线程池正在减慢我的速度。 MSDN建议我应该将它指定为一个长期运行的任务,但我无法看到这样做的方法。
现在我还没有限制线程,我只是在批量测试并测试速度以发现正确的方法。
有人可以建议我看一些区域来提高速度吗?
答案 0 :(得分:0)
在使用HttpClient
实例创建多个基于实例的static
时,您可能会遇到一些开销。您的实施将无法扩展。实际上建议使用共享HttpClient
。
请参阅我的回答为什么 - What is the overhead of creating a new HttpClient per call in a WebAPI client?