SqlConnection расположен, когда она завершена. Это происходит потому, что он наследует от Component, который has a finalizer that calls Dispose. Завершение является одним из этапов сбора мусора. Сбор мусора работает недетерминированно, т. Е. Всякий раз, когда CLR чувствует себя так. Garbage collection in C# is totally unrelated to an object going out of scope.
Таким образом, если SqlConnection выходит за пределы сферы действия, он в какой-то момент в будущем будет завершен и поэтому закрыт. Это плохо, потому что до тех пор, пока эта доработка не оправдалась, вы тратите ресурсы. Позже в вашей программе вы можете не открыть соединение, потому что слишком много соединений уже открыты (хотя они фактически не используются и просто ждут завершения).
Именно поэтому настоятельно рекомендуется убрать ваши SqlConnections после их использования.
(Не читайте это как каноническую правду о том, как работает финализация SqlConnection. Я упростил детали, чтобы сосредоточиться на различии между окончательной доработкой и явным удалением).
Возможно, вы проведете [будет SqlConnection получить для GC] (http://stackoverflow.com/questions/3637549/will-sqlconnection-get-disposed-by-gc) для хорошего общего обсуждения этой проблемы. В конце концов, вы не должны ожидать слишком много помощи, потому что, если вы позволяете открытому подключению выходить из сферы действия, это ошибка в вашем коде, простая и простая. –