优化asyncronus HttpClient请求

时间:2015-05-11 00:19:43

标签: c# .net multithreading asynchronous

我已经创建了一个类来处理多个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建议我应该将它指定为一个长期运行的任务,但我无法看到这样做的方法。

现在我还没有限制线程,我只是在批量测试并测试速度以发现正确的方法。

有人可以建议我看一些区域来提高速度吗?

1 个答案:

答案 0 :(得分:0)

在使用HttpClient实例创建多个基于实例的static时,您可能会遇到一些开销。您的实施将无法扩展。实际上建议使用共享HttpClient

请参阅我的回答为什么 - What is the overhead of creating a new HttpClient per call in a WebAPI client?