Использование HttpClient синхронно приводит к утечке памяти - PullRequest
1 голос
/ 11 апреля 2020

При попытке вызвать HttpClient.SendAsync() синхронно в al oop, память, используемая процессом, продолжает расти (как сообщает «Activity» в Instruments). Ниже приведено простейшее повторение, которое я мог создать (добавить в конце ViewController.ViewDidLoad() в новом Xamarin. iOS Single View App).

Task.Run(() =>
{
    var httpClient = new HttpClient();
    httpClient.BaseAddress = new Uri("https://www.google.com/", UriKind.Absolute);
    var requestUri = "images/branding/googlelogo/1x/googlelogo_color_272x92dp.png";
    while (true)
    {
        using (var httpResponseMessage = httpClient.GetAsync(requestUri).Result)
        {
            Console.WriteLine(httpResponseMessage.Content.Headers.ContentLength);
        }
        Task.Delay(10).Wait();
    }
});

Создание асинхронного c решает проблему:

Task.Run(async () =>
{
    var httpClient = new HttpClient();
    httpClient.BaseAddress = new Uri("https://www.google.com/", UriKind.Absolute);
    var requestUri = "images/branding/googlelogo/1x/googlelogo_color_272x92dp.png";
    while (true)
    {
        using (var httpResponseMessage = await httpClient.GetAsync(requestUri).ConfigureAwait(false))
        {
            Console.WriteLine(httpResponseMessage.Content.Headers.ContentLength);
        }
        await Task.Delay(10).ConfigureAwait(false);
     }
});

На данный момент я не уверен, ожидается ли утечка в синхронном коде или это настоящая ошибка в моно.

Среда:

  • Microsoft Visual Studio Professional 2019 версии 16.5.3
  • Xamarin. iOS и Xamarin.Ma c SDK 13.16.0.13 (b75deaf)
...