Должен ли я вызвать GC.Collect в пользовательском пуле потоков? - PullRequest
0 голосов
/ 16 декабря 2010

Я создал пул потоков, который имеет 5 потоков. Они оба начнутся, когда мое приложение запустится. Проблема в том, что я создал так много объектов в функции обратного вызова цикла потока в каждом потоке, и память увеличивается на секунду при запуске приложения, это функция обратного вызова цикла потока:

void ThreadLoop () {
while (true) {
var checkItems = _workItems.Where (w => w.ActivedTime> 3) .ToList ();
foreach (var i in checkItems) {
_workItems [i.Id] .ActivedTime = 0;
_workItems [i.Id] .ExecutePostBack ();
}
// Воссоздать новый словарь _workItems
_workItems = _workItems.Where (w => w.ActivedTime> 0) .ToDictionary ();
// Спящая нить, чтобы освободить память
Thread.Sleep (1000);
// Call Grab сборщик свободной памяти
GC.Collect ();
}
}

Я путаю это, вызывает ли GC.Collect () для каждого потока хороший или плохой? Доза это вызывает плохую работу?

Ответы [ 3 ]

1 голос
/ 16 декабря 2010

Если вам нужно спросить себя, следует ли звонить в GC.Collect, ответ почти наверняка будет «нет».GC спроектирован так, чтобы запускаться автоматически по мере необходимости, и при его вызове он сам говорит: «Я знаю лучше, чем сам GC, когда он должен работать».Любой, кто не знает подробностей о GC, скорее всего, будет неправ, чем прав, и на самом деле все усугубит ситуацию.

Лучший способ действий - почти всегда позволить GC позаботиться о себе.

0 голосов
/ 16 декабря 2010

Вам не нужно вызывать GC.Collect () в большинстве случаев, за исключением редких ситуаций (и я думаю, что у вас нет). Смотрите здесь для более подробного объяснения: http://blogs.msdn.com/b/ricom/archive/2004/11/29/271829.aspx

0 голосов
/ 16 декабря 2010

Не рекомендуется вызывать GC.Collect, если только вам это не нужно, например, в некоторых случаях с COM-взаимодействием.В лучшем случае вы вызываете GC больше, чем нужно, в худшем случае вы можете продвигать недолговечные объекты в более старшие поколения GC, что делает их более дорогими для последующей очистки.на давление памяти, когда память выделяется, а не время.Так что нередко можно увидеть временный всплеск памяти, который долго зависает, если вы больше не выделяете новые объекты.В этом случае было бы нормально вызывать GC.Collect, но я бы не стал вызывать его в цикле, если вы можете.

...