J'ai un problème de fuite de mémoire lorsque j'utilise httpClient.GetAsync
.
Dans le gestionnaire des tâches, les processus restent avec une forte consommation de mémoire qui n'est pas libérée.
Voici mon code :
HttpClient httpClient = new HttpClient();
httpClient.Timeout = TimeSpan.FromMinutes(2);
try
{
using (var response = await httpClient.GetAsync(fullURL))
{
if (!response.IsSuccessStatusCode)
{
Logger.Default.Error($"error code {(int)response.StatusCode} - {response.StatusCode}");
return null;
}
using (MemoryStream memStream = new MemoryStream())
{
await response.Content.CopyToAsync(memStream);
Logger.Default.Debug($"finished reading response, sized {Math.Round(memStream.Length / Math.Pow(1024, 2), 2)} MB");
}
}
}
catch (TaskCanceledException ex)
{
Logger.Default.Error($"Request timed out. {ex.Message}\n{ex.StackTrace}");
return null;
}
Cependant, lorsque j'utilise httpClient.GetStreamAsync
à la place, et changer :
await response.CopyToAsync(memStream);
A :
await response.Content.CopyToAsync(memStream);
La mémoire se libère au bout de quelques secondes. Mais je préfère utiliser GetAsync
puisqu'il me fournit des informations sur le code d'état, qui GetStreamAsync
ne le fait pas.
J'ai déjà essayé d'appeler le Garbage collector ( GC.Collect(2)
) après que l'objet ait été éliminé, mais cela n'a pas aidé.
Qu'est-ce que je fais de mal ?