Przeszukiwanie HttpClient powoduje wyciek pamięci

Pracuję nad WebCrawlerrealizacja ale stoję przed dziwnym wyciekiem pamięci w HttpClient ASP.NET Web API.

Tak więc wersja skrócona jest tutaj:

[AKTUALIZACJA 2]

Znalazłem problem i nie przecieka HttpClient. Zobacz moją odpowiedź.

[AKTUALIZACJA 1]

Dodałem dispose bez efektu:

    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();
    }

Plik zawierający łącza jest dostępnytutaj.

Powoduje to ciągłe podnoszenie pamięci. Analiza pamięci pokazuje wiele bajtów przechowywanych prawdopodobnie przez AsyncCallback. Przeprowadziłem już wiele analiz przecieków pamięci, ale ta wydaje się być na poziomie HttpClient.

Używam C # 4.0, więc nie ma tu asynchronizacji / czekania, więc używany jest tylko TPL 4.0.

Powyższy kod działa, ale nie jest zoptymalizowany i czasami rzuca napad złości, ale wystarczy, aby odtworzyć efekt. Chodzi o to, że nie mogę znaleźć żadnego punktu, który mógłby spowodować wyciek pamięci.

questionAnswers(2)

yourAnswerToTheQuestion