Должен ли я использовать деструктор или IDisposable в консольном приложении

#c#

#c#

Вопрос:

По сути, я открываю соединение с базой данных при запуске приложения, и оно должно оставаться открытым до срока службы приложения.

Я использую консольное приложение для этого фонового задания:

 class Program
    {
        #region '----- Method(s) -----'
        static void Main(string[] args)
        {

        }

        ~Program()
        {

        }
        #endregion
    }
  

Должен ли я закрыть соединение с базой данных в моем деструкторе или я должен реализовать IDisposable?

Ответ №1:

Использовать IDisposable .

Лучший способ сделать это — создать его в using инструкции.

 using (var conn = new SqlConnection(connectionString)) 
{
    // your code here
}
  

Комментарии:

1. Да, но мне нужно подключение к базе данных через методы. Поэтому использование не будет работать. Мне это нужно как переменная экземпляра.

2. @Jaggu — Вы можете передавать соединение другим методам. Не уверен, что использование переменной экземпляра является хорошей идеей при использовании соединений.

3. будет ли фреймворк вызывать мой метод dispose? Если я закрою соединение в dispose, потому что его нужно вызывать явно.

4. @Jaggu — Классы соединений закрываются при их удалении. Если вы реализуете IDisposable себя, вызовите Dispose соединения.

5. Будет ли это работать, если пользователь нажмет ctrl c или нажмет кнопку закрытия в окне?

Ответ №2:

Хм .. Если вы не создаете экземпляр program class, то ему не нужен финализатор, потому что финализаторы вызываются только для экземпляра объектов. Вам не нужен ни финализатор, ни IDisposable. Вы должны это сделать:

 static void Main(string[] args)
{
    db.Dispose();//In the end of console app executing code
}
  

Ответ №3:

Поверьте мне, вы не хотите этого делать, в рекомендациях говорится использовать соединение только при необходимости и закрывать его как можно скорее. Если вам нужна транзакция, вы можете использовать транзакцию Sql и поместить методы внутри транзакции using of sql

 using(SqlConnection sqlconn= new ())
   using(SqlTransaction sqltrann = new ())
{
  {    
     method1
     method 2
  }
}
  

Ответ №4:

Здесь вы можете использовать реализацию шаблона dispose, что желательно. В противном случае убедитесь, что вы наследуете свой фактический тип CriticalFinalizerObject , чтобы принудительно использовать CLR для помещения вашего экземпляра типа в очередь завершения независимо от условий выполнения.

 class Program:CriticalFinalizerObject
 {
        #region '----- Method(s) -----'
        static void Main(string[] args)
        {

        }

        ~Program()
        {

        }
        #endregion
}