none
C# WPF Code First Как закрыть соединение и освободить файл для копирования? RRS feed

  • Вопрос

  • Спасибо за точный ответ. Вокруг пула рылся в МСДНе последние пару часов. НО...

    1. По Вашему совету подправил строку соединения:

            public void AddUser(User item)
            {
                using (var context = new DbContextStatus(@"Data Source=(LocalDB)\MSSQLLocalDB;" +
                    "AttachDbFilename=|DataDirectory|\\status.mdf;Integrated Security=True;Pooling=false"))
                {
                    SqlConnection.ClearAllPools();
                    context.Users.Add(item);
                    context.SaveChanges();
                    context.Database.Connection.Dispose();
                }
            }

    2. Очищаю пул перед копирование файла.

            private void ButtonNewBase_OnClick(object sender, RoutedEventArgs e)
            {
                // Вызываю модальное окно ввода параметров новой базы данных
                NewBase windowNewBase = new NewBase { Owner = this };
                windowNewBase.ShowDialog();
                // Чтение из файла конфигурации и запись новой строки подключения.
                GetConnectionStrings();
                // Создать базу данных
                DbGenerate();
                // Очищаю пул соединений
                SqlConnection.ClearAllPools();
                // Копируем эту базу в указанное место
                CopyDataBase(sourceFileName, FileName);
            }
    В результате всего этого файл базы данных освобождается, но с некоторой задержкой. И на CopyDataBase(sourceFileName, FileName); все равно вываливается исключение. На инетресурсах есть совет организовать задержку по времени. Других решений не нашел. Как-то это не совсем правильно, по моему мнению. М.б. Вы дадите совет?

Ответы

  • Да, действительно, видимо это единственное решение.

    Получается примерно такой код:

    private void CopyDataBase(string sourceFileName, string fileName)
            {
                for (int attempt = 0; attempt < 3; attempt++)
                {
                    Thread.Sleep(500);
                    try
                    {
                        File.Copy(sourceFileName, fileName, true);
                        break;
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message);
                    }
                }
            }

    Взято отсюда.

    Выглядит как костыль, но других решений пока найти не удалось...

    • Помечено в качестве ответа AlexServer61 12 мая 2016 г. 18:09

Все ответы

  • Поставил задержку в 100 мсек. Работает. :) Интересно, задержка как-то зависит от железа? Характеристики проца и HDD влияют?
  • Да, действительно, видимо это единственное решение.

    Получается примерно такой код:

    private void CopyDataBase(string sourceFileName, string fileName)
            {
                for (int attempt = 0; attempt < 3; attempt++)
                {
                    Thread.Sleep(500);
                    try
                    {
                        File.Copy(sourceFileName, fileName, true);
                        break;
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message);
                    }
                }
            }

    Взято отсюда.

    Выглядит как костыль, но других решений пока найти не удалось...

    • Помечено в качестве ответа AlexServer61 12 мая 2016 г. 18:09