首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Autofac - IHTTPClientFactory多线程

Autofac - IHTTPClientFactory多线程
EN

Stack Overflow用户
提问于 2021-02-26 23:58:04
回答 1查看 143关注 0票数 0

我正在使用NET Framework4.7.2与Autofac和Topshelf,并且我已经实现了一个HTTPClient,如下所示:

代码语言:javascript
复制
private static IContainer BuildContainer() {

    NameValueCollection anexiaADSettings = (NameValueCollection)ConfigurationManager.GetSection("AnexiaADSettings");

    var services = new ServiceCollection();
    services.AddHttpClient("API", c => {
        c.BaseAddress = new Uri(Settings["APIUrl"]);
        c.DefaultRequestHeaders.Add("Authorization", "Token " + Settings["APIToken"]);
        c.DefaultRequestHeaders.Accept.Clear();
        c.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
    });

    var providerFactory = new AutofacServiceProviderFactory();
    ContainerBuilder builder2 = providerFactory.CreateBuilder(services);

    //Builder Settings

    var container = builder2.Build();

    return container;

}

在我的Worker类中,我的构造函数看起来像:

代码语言:javascript
复制
private readonly ILogger _log;
private readonly IHttpClientFactory _clientFactory;

public LDAP(ILogger log, IHttpClientFactory clientFactory) {
    this._log = log;
    this._clientFactory = clientFactory;
}

我在一个带有以下参数的多线程foreach循环中调用我的httpClient:

代码语言:javascript
复制
var httpClient = _clientFactory.CreateClient("API");
test= await httpClient.GetFromJsonAsync<Models.GSObject>(uri);

问题是,foreach循环启动了多次,但显然只有一个活动的httpClient实例。如果我使用10个线程执行该方法,则GetFromJsonAsync将按顺序运行。如果第一个调用已经执行,它将转到下一个调用,依此类推。httpClient不应该获得与我触发foreach循环相同数量的实例吗?

编辑:这是当前执行的循环,最多有10个线程:

代码语言:javascript
复制
        var taskThrottler = new SemaphoreSlim(initialCount: 10);
        var compareTasks = new List<Task>();

        foreach (var User in Users.data.data) {

            await taskThrottler.WaitAsync();

            compareTasks.Add(
                Task.Run(async () => {
                    try {
                        await _helper.CompareUsersAsync(_settings, adUsers, gsUser.identifier);
                    }
                    finally {
                        taskThrottler.Release();
                    }
                })
            );
        }

CompareUsersAsync方法如下所示:

代码语言:javascript
复制
    public async Task CompareUsersAsync(Settings settings, List<Models.ADUser> adUsers, string identifier) {

        var httpClient = _clientFactory.CreateClient("API");
        
        try {
            string uri = "api/request.json/" + identifier;

            
            Models.GSADUser gsUser = await httpClient.GetFromJsonAsync<Models.GSADUser>(uri);

//Removed the rest of the code.
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-02 01:32:34

我已经找到了解决方案。到同一服务器的连接的默认最大值设置为2。如果你想增加这个值,你必须定义一个ServicePointManager,如下所示:

代码语言:javascript
复制
        ServicePointManager.DefaultConnectionLimit = 20;

        var services = new ServiceCollection();
        services.AddHttpClient("EngineAPI", c => {
            c.BaseAddress = new Uri("URL");
            c.DefaultRequestHeaders.Add("Authorization", "Token " + settings["APIToken"]);
            c.DefaultRequestHeaders.Accept.Clear();
            c.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
        });

在这种情况下,最多允许20个连接到同一个端点。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66388980

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档