none
Странная работа Сборщика Мусора (или что там автоматически вызывает Dispose() ) RRS feed

  • Вопрос

  • Вот заметил такой косяк, с которым бился не один день.

    Если открывать подключение к базе данных "классическим" способом (но без вызова Dispose() после использования ), то всё работает нормально, вот код:

    private void connect_menu_Click(object sender, RoutedEventArgs e)
            {
                Connect cnt = new Connect();
                cnt.ShowDialog();
    
                //----------чтение настроек из файла------------
                XDocument config = XDocument.Load("config.cfg");
                string server_adres = (string)config.Root.Element("server_adres");
                string db_name = (string)config.Root.Element("db_name");
                string login = (string)config.Root.Element("login");
                string password = cnt.Password;
                string connection_string = "Data Source={0};Initial Catalog={1};Persist Security Info=True;User ID={2};Password={3}";
    
                LM db = new LM(String.Format(connection_string, server_adres, db_name, login, password));
                
                    if (!db.DatabaseExists())
                        db.CreateDatabase();
                    else
                        this.DataView.DataContext = db.TakeBooks.ToList();
    
                
            }

    Но стоит заключить обращение к БД в блок Using, как в коде ниже (или добавить db.Dispose() ), то получается пичалька, как на скриншоте чуть пониже кода:

            private void connect_menu_Click(object sender, RoutedEventArgs e)
            {
                Connect cnt = new Connect();
                cnt.ShowDialog();
    
                //----------чтение настроек из файла------------
                XDocument config = XDocument.Load("config.cfg");
                string server_adres = (string)config.Root.Element("server_adres");
                string db_name = (string)config.Root.Element("db_name");
                string login = (string)config.Root.Element("login");
                string password = cnt.Password;
                string connection_string = "Data Source={0};Initial Catalog={1};Persist Security Info=True;User ID={2};Password={3}";
    
                using (LM db = new LM(String.Format(connection_string, server_adres, db_name, login, password)))
                {
                    if (!db.DatabaseExists())
                        db.CreateDatabase();
                    else
                        this.DataView.DataContext = db.TakeBooks.ToList();
                }
            }

    Скрин пичальки:

    Скрин хайрез на SkyDrive, а то форум уменьшает размер.


    MSDN AA User

    28 апреля 2012 г. 12:41

Ответы

  • Когда Вы создаёте объект в блоке using, то после выхода из этого блока Ваш "using" и вызывает метод Dispose(). Так ка ObjectContext реализует интерфейc.

    IDisposable

    Не вызываете его, нет нужды, DataContext делает это за Вас.


    • Помечено в качестве ответа asdfxcbneftyherwe 28 апреля 2012 г. 13:17
    • Изменено YatajgaEditor 28 апреля 2012 г. 13:20 Опечатки
    28 апреля 2012 г. 13:16
    Модератор

Все ответы