Сборка мусора внутри объекта блокировки - PullRequest
3 голосов
/ 13 октября 2010

Если оставить в стороне мнения людей о вывозе мусора, есть ли какие-либо проблемы с блокировкой со следующим:

private static readonly object lockObj = new object();
lock(lockObj )
{
           ///Load objects into a cache List<object> from DB call 
           GC.Collect(2);
           GC.WaitForPendingFinalizers();
           GC.Collect(2);
}

Ответы [ 2 ]

2 голосов
/ 13 октября 2010

Основные изменения, поэтому комментарии могут показаться неуместными.Приносим извинения за неудобства.

Трудно сказать наверняка.

Если предположить, что код выглядит примерно так

public class SomeType {
   private static readonly object Lock = new object();

   public void Foo() {
      lock (Lock) {
         Console.WriteLine("in foo");
         GC.Collect(2);
         GC.WaitForPendingFinalizers();
         GC.Collect(2);
      }
   }

   ~SomeType() {
      lock (Lock) {
         Console.WriteLine("in finalizer");
      }
   }
}

Вы можете зайти в тупик, если у вас будет больше экземпляров SomeTypeпоскольку все они разделяют статический объект для блокировки.Вам нужно иметь как минимум один некорневый и несобранный экземпляр SomeType и вызывать Foo в другом экземпляре.

Теперь, если у вас нет финализатора, как указано выше, я не вижу, как код мог зайти в тупик.

0 голосов
/ 13 октября 2010

Нет возможности тупика. Но зачем блокировать это? Почему второй GC.Collect ()?

GC.WaitForPendingFinalizers () является блокирующим кодом, поэтому не будет возвращаться до завершения Так что я не уверен, чего вы добиваетесь, блокируя.

...