HttpClient rampant entraîne une fuite de mémoire

Je suis en train de travailler sur un WebCrawler la mise en œuvre mais suis confronté à un étrange fuite de mémoire dans ASP.NET Web API HttpClient.

De sorte que la coupe vers le bas la version est ici:


[Mise à JOUR 2]

J'ai trouvé le problème et il n'est pas HttpClient qui fuit. Voir ma réponse.


[JOUR 1]

J'ai ajouté en disposer avec aucun effet:

    static void Main(string[] args)
{
int waiting = 0;
const int MaxWaiting = 100;
var httpClient = new HttpClient();
foreach (var link in File.ReadAllLines("links.txt"))
{
while (waiting>=MaxWaiting)
{
Thread.Sleep(1000);
Console.WriteLine("Waiting ...");
}
httpClient.GetAsync(link)
.ContinueWith(t =>
{
try
{
var httpResponseMessage = t.Result;
if (httpResponseMessage.IsSuccessStatusCode)
httpResponseMessage.Content.LoadIntoBufferAsync()
.ContinueWith(t2=>
{
if(t2.IsFaulted)
{
httpResponseMessage.Dispose();
Console.ForegroundColor = ConsoleColor.Magenta;
Console.WriteLine(t2.Exception);
}
else
{
httpResponseMessage.Content.
ReadAsStringAsync()
.ContinueWith(t3 =>
{
Interlocked.Decrement(ref waiting);
try
{
Console.ForegroundColor = ConsoleColor.White;
Console.WriteLine(httpResponseMessage.RequestMessage.RequestUri);
string s =
t3.Result;
}
catch (Exception ex3)
{
Console.ForegroundColor = ConsoleColor.Yellow;
Console.WriteLine(ex3);
}
httpResponseMessage.Dispose();
});                                                                                
}
}
);
}
catch(Exception e)
{
Interlocked.Decrement(ref waiting);
Console.ForegroundColor = ConsoleColor.Red;                                             
Console.WriteLine(e);
}
}
);
Interlocked.Increment(ref waiting);
}
Console.Read();
}

Le fichier contenant les liens est disponible ici.

Il en résulte une hausse constante de la mémoire. Mémoire analyse indique le nombre d'octets tenu, éventuellement, par la AsyncCallback. J'ai fait beaucoup de fuite de mémoire analyse avant mais celui-ci semble être à la HttpClient.

HttpClient rampant entraîne une fuite de mémoire

Je suis à l'aide de C# 4.0, donc pas async/await ici, donc seulement TPL 4.0 est utilisé.

Le code ci-dessus fonctionne, mais n'est pas optimisé, et parfois jette crise est encore assez pour reproduire l'effet. Point est que je ne peut pas trouver n'importe quel point qui pourrait provoquer mémoire fuite.

source d'informationauteur Aliostad