Лучше, если Вы не уничтожаете поток. Путь мог состоять в том, чтобы ввести блок "попытки" в цикл потока и выдать исключение, когда Вы хотите остановить поток (например, break/return/..., который останавливает Ваш for/while/...). Я использовал это на своем приложении, и оно работает...
Обычно вы хотите, чтобы пул соединений выполнял свою работу - вы не хотите, чтобы соединение действительно закрылось.
Почему вы конкретно хотите, чтобы соединение не возвращалось в пул?
Если вы не хотите использовать пул соединений, вы необходимо указать его в свойстве SqlConnection.ConnectionString
. Например,
"Data Source=MSSQL1;Database=AdventureWorks;Integrated Security=true;Pooling=false;"
Удаление или закрытие объекта SqlConnection
просто закрывает соединение и возвращает его в пул соединений.
CommandBehavior.CloseConnection
обычно не рекомендуется именно из-за этого факта - Вы не можете быть уверены, что соединение будет закрыто. (Я попытаюсь найти некоторые конкретные доказательства этого, я говорю это по слабому воспоминанию.)
Dispose ()
- самый надежный способ, потому что он неявно вызывает Close ()
.
Конструкция using
, продемонстрированная @Alex, - это просто еще один (удобный для программистов) способ написания конструкции try-finally
с добавленным неявным удалением объектов .
Редактировать: (после редактирования вопроса)
Ваше беспокойство по поводу закрытия соединений на самом деле кажется мне необоснованным. Соединение просто вернется в пул, чтобы его можно было легко использовать повторно, не выполняя всю инициализацию.
Ответ Мо Сиско (вызов SqlConnection.ClearPool
) правильный.
Иногда вам нужно, чтобы соединение действительно закрылось, а не возвращалось в бассейн. В качестве примера у меня есть модульный тест, который создает временную базу данных, строит схему, тестирует некоторые вещи, а затем удаляет временную базу данных, если все тесты проходят.
Когда пул соединений активен, команда удаления базы данных завершается ошибкой, поскольку все еще существуют активные соединения. С точки зрения программиста все SQLConnections закрыты, но поскольку пул по-прежнему содержит одно открытое, SQL Server не допускает сброса.
Лучшая документация о том, как обрабатывается пул соединений, - эта страница о пуле подключений SQL Server в MSDN. Нельзя полностью отключать пул соединений, потому что он повышает производительность при повторных открытиях и закрытиях, но иногда вам нужно вызвать «принудительное закрытие» для SQLConnection, чтобы оно отпустило базу данных.
Это делается с помощью ClearPool. Если вы вызовете SqlConnection.ClearPool (connection)
перед закрытием / удалением, при закрытии / удалении он действительно исчезнет.