Как статический Httpclient ведет себя в ситуациях параллелизма? - PullRequest
0 голосов
/ 28 февраля 2019

Я знаю, что многие обсуждали это раньше и согласились, что Httpclient лучше всего создать один раз и использовать для всего приложения.У меня есть несколько вопросов по этому вопросу.

Допустим, у меня есть класс бизнес-уровня со статической переменной Httpclient (с двойной проверкой блокировки), и веб-страница создает объект класса бизнес-уровня.

Код класса:

  public class BL
{
    //Lock object for double lock check
    private static readonly object padlock = new object();
    public static HttpClient httpClient;

    public BL()
    {
        if (httpClient == null)
        {
            lock (padlock)
            {
                if (httpClient == null)
                {
                    httpClient = new HttpClient();
                }

            }
        }
    }

    public async Task<HttpResponseMessage> GetData(String URL)
    {
       return await httpClient.GetAsync(URL).ConfigureAwait(false);
    }
}

Код страницы

protected void Page_Load(object sender, EventArgs e)
    {
        BL blObj = new BL();
        HttpResponseMessage response = blObj.GetData("http://....");
    }
  1. Статические переменные сохраняются в течение всего времени жизни приложения.Это означает, что статический httpclient будет активен до тех пор, пока IIS и веб-приложение хоста будут активны (даже после окончания жизненного цикла страницы, на которой создан BL-объект) или будут просто жить до тех пор, пока страница не будет удалена?

  2. Если несколько одновременных страниц, например, 500 создали объект BL и использовали статический httpclient, как 500 пользователей будут обслуживаться только одним статическим httpclient, который разрешает только одно http-соединение с сервером?Я не могу получить это.

  3. Есть ли надежный инструмент для визуальной студии для тестирования загрузки и производительности вышеуказанного кода?

1 Ответ

0 голосов
/ 28 февраля 2019
  1. Статическое поле действует до тех пор, пока AppDomain не будет удален, то есть потому, что они не принадлежат экземпляру объекта, следовательно, они не будут CGed.в ситуации IIS, в зависимости от ваших настроек в IIS, он будет жить вечно, если пул приложений не будет переработан.

  2. Да, этот статический клиентский объект будет обслуживать все 500 одновременных запросов,но вы должны быть очень осторожны, если HttpClient является потокобезопасным объектом.Если нет, попробуйте сделать это следующим образом: создайте пул HttpClient, свяжите состояние с каждым объектом HttpClient в пуле, поднимите бездействующий HttpClient в пуле, пока объект BL пытается получить данные

  3. VS получил много инструментов для повышения производительности, MS выпустила инструмент для повышения производительности, который называется VSPerfASPNetCmd, для мониторинга использования ЦП, использования памяти, подробности можно найти на странице ниже https://docs.microsoft.com/en-us/visualstudio/profiling/vsperfaspnetcmd?view=vs-2017
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...