Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.09.2015, 15:26   #1
constant_ural
Пользователь
 
Регистрация: 25.06.2013
Сообщений: 14
По умолчанию Сборщик мусора не удаляет объект

Сборщик мусора не удаляет объект. Мне необходимо чтобы GC его удалил, но этого не происходит.
Привожу предельно упрощенный код моей программы.

Простая форма XAML с лейблом и кнопкой, нажатие кнопки запускает уничтожение объекта:
Код:
<Window x:Class="Disposer.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Label Name="TestLabel"  Margin="0,0,325,189"></Label>
        <Button Margin="203,12,72,216" Click="Button_Click"></Button>
    </Grid>
</Window>
Класс foo имеет единственное поле A, которое генерирует событие NotifyPropertyChange,
запускается новый поток, в нем поле A раз в секунду обновляется, метод Dispose останавливает поток.

Код:
public class foo:INotifyPropertyChanged, IDisposable
    {
        Thread thr;
        volatile bool bThrEnabled = true;
        public event PropertyChangedEventHandler PropertyChanged;
        int t = 0;    
       
        protected void RaisePropertyChanged(string prop)
        {
            if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(prop)); }
        }
           
        private string _a;
        public string A
        {
            get
            {
                return _a;
            }
            set
            {
                _a = value;
                RaisePropertyChanged("A");
            }
        }

        public foo()
        {                      
         thr = new Thread(ThreadFunc);     
         (thr).Start();            
        }
        

        public void ThreadFunc()
        {
            while (bThrEnabled)        
           {
               A = (t++).ToString();             
               Thread.Sleep(1000);
               if (!bThrEnabled) break;
           }

            PropertyChanged = null;
            A = null;
           _a = null;
        }
        public void Dispose()
        {
            bThrEnabled = false;

            while (thr.IsAlive)
                Thread.Sleep(1000);
                 
        }

         ~foo()
        {


        }

    }
Ну и код класса окна. Здесь мы привязываем созданный объект класса foo, привязываем лейбл на форме к нему.
При нажатии на кнопку, удаляем привязку, обнуляем ссылку на объект. После этого, принудительно просим GC почистить.
Код:
 public partial class MainWindow : Window 
    {

        foo fooInst;       
        public MainWindow()
        {
            InitializeComponent();

            fooInst = new foo();
    
            Binding bg = new Binding();
            bg.Path =  new PropertyPath("A");
            bg.Source = fooInst;
           BindingOperations.SetBinding(TestLabel, Label.ContentProperty, bg);
                               
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            fooInst.Dispose();          
           BindingOperations.ClearAllBindings(TestLabel);
           BindingOperations.ClearBinding(TestLabel, Label.ContentProperty);
        
           TestLabel.DataContext = null;

           fooInst = null;
                                                          
           GC.Collect();
            GC.WaitForPendingFinalizers();         
        }
    
    }
При данных условиях финализатор ~foo() не вызывается, что говорит о том,
что сборщик мусора объект не удаляет. Однако, если закоментить привязку, все будет работать как надо.
Что нужно сделать, чтобы сборщик мусора удалил объект класса foo ?
constant_ural вне форума Ответить с цитированием
Старый 29.09.2015, 15:43   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Как вы узнали, что не вызывается, если он пустой?
У меня вызывается.
Код:
        ~foo()
        {
            Debug.WriteLine("f");
        }
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 29.09.2015, 16:55   #3
constant_ural
Пользователь
 
Регистрация: 25.06.2013
Сообщений: 14
По умолчанию

Цитата:
Как вы узнали, что не вызывается, если он пустой?
Поставил брейкпойнт.
constant_ural вне форума Ответить с цитированием
Старый 29.09.2015, 17:06   #4
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Ну у меня и брекпоинт срабатывает, и в консоль пишет.

Мне кажется пустой финализатор может быть удален при оптимизации компилятором.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 29.09.2015, 17:31   #5
constant_ural
Пользователь
 
Регистрация: 25.06.2013
Сообщений: 14
По умолчанию

Да, действительно если финализатор не пустой, то работает. И да, я тоже думаю, что это "проделки" оптимизатора, наверно.

Видимо проблема решена.
Как бы то ни было, Alex11223 преогромнейшее человеческое спасибо !
constant_ural вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
сборщик мусора goluzov Общие вопросы C/C++ 2 29.04.2012 15:25
Сборщик мусора для отдельного класса _-Re@l-_ Общие вопросы C/C++ 17 13.08.2011 12:30
Сборщик мусора в динамическом списке Homutova_Julia Помощь студентам 4 17.06.2011 19:09
Не могу организовать сборщик мусора Homutova_Julia Помощь студентам 5 08.06.2011 13:22
Опрос: Сборщик мусора Пепел Феникса Общие вопросы по программированию, компьютерный форум 15 20.04.2011 19:19