При попытке вызвать 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)