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 делает это. Спасибо за все ваши ответы.
Ответы
Ответ 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()
снова. Идея этого заключается в том, чтобы гарантировать, что экземпляры с финализаторами также будут исправлены, так как они выживут в первой коллекции. Имейте в виду, что это может вызвать задержку в применении, и это очень редко необходимо.