Подтвердить что ты не робот

GC.Collect в цикле?

Я нашел этот фрагмент кода внутри System.Web.ISAPIRuntime с использованием Reflector

public void DoGCCollect()
{
    for (int i = 10; i > 0; i--)
    {
        GC.Collect();
    }
}

Кто-нибудь может прокомментировать это? Есть ли причина сделать GC.Collect() в цикле? Почему 10 раз, а не 3, 5 или 20? Анализ показал, что он не используется внутри .net framework, но он общедоступен, поэтому я полагаю, что IIS мог бы назвать это...

изменить:

Только для разъяснений: я никогда не называл GC.Collect, и у меня нет намерений использовать его. Я знаю, что это плохая идея в большинстве (если не во всех) случаях. Вопрос в том, почему .net framework делает это. Спасибо за все ваши ответы.

4b9b3361

Ответ 1

Я не думаю, что вы получите лучшее объяснение, что "один из программистов Microsoft довольно неуловим, и, судя по всему, никто не потрудился посмотреть на его код, прежде чем он был проверен".;)

Это выглядит страшно, хотя.

Это довольно распространенный ответ на ошибки, которые вы не понимаете. По какой-то причине вы пытаетесь вызвать GC, и каким-то образом ее вызов, похоже, не решает вашу проблему (возможно, реальной проблемой было только то, что вы должны ждать нити финализатора или что-то в этом роде), поэтому наивное решение очевидно "Ну, я просто буду называть это тогда".

Аналогично нажатию "печатать" до тех пор, пока не будет напечатан ваш документ.

Возможно, вы должны отправить его на thedailywtf.com.

Ответ 2

Да, это ужасно. Во-первых, вам не нужно делать это вообще. Однако, если вы действительно хотите принудительно собрать сборку мусора, и можете дождаться ее завершения, вы, вероятно, должны использовать:

GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced);
GC.WaitForPendingFinalizers();
// Collect anything that just been finalized
GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced);

Правда, это не хорошая идея.

Ответ 3

Выглядит действительно ужасно:)

Ответ 4

Мне очень нравится реализация Mono этого метода:

public void DoGCCollect ()
{
  // Do nothing.
}

Возможно, разработчик намеревался написать что-то подобное, и это просто опечатка.

Ответ 5

Похоже, что кто-то с комплексом "конец света" написал его с коннотациями о том, что они будут заканчивать мир с помощью 10-секундного таймера...

Ответ 6

Не следует ли указывать на Microsoft? Будет ли полезно публиковать это на сайте Connect?

Ответ 7

Это не очень хорошая идея, потому что вы действительно должны доверять сборщику мусора, чтобы выполнять свою работу, не будучи вызванным специально из вашего кода.

99,9% времени, когда вам никогда не нужно вызывать GC из вашего кода.

Ответ 8

Прежде всего, не стоит называть GC.Collect(). Вызов его несколько раз малоэффективен.

Однако вы иногда видите шаблон вызова Collect(), затем WaitForPendingFinalizers(), а затем, наконец, Collect() снова. Идея этого заключается в том, чтобы гарантировать, что экземпляры с финализаторами также будут исправлены, так как они выживут в первой коллекции. Имейте в виду, что это может вызвать задержку в применении, и это очень редко необходимо.