2015-09-29 8 views
3

Вопрос по заголовку.Использует ли «ресурс блокировки блока» при закрытии программной силы

У меня есть кусок кода, который делает это:

using (SqlConnection dbcon = new SqlConnection(connectionString)) 
    using (SqlDataAdapter dataAdapter = new SqlDataAdapter(statement, dbcon)) 
    { 
     dat_set = new System.Data.DataSet(); 

     dbcon.Open(); 
     dataAdapter.Fill(dat_set, name); 
    } 

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

Я знаю, что «используя» блок освобождает ресурс, когда он выходит из сферы действия, но в случае прекращения силы извлекает ли ресурсы изящно?

+1

вопрос большой: «почему вы вынуждаете выйти из программы, когда dataAdapter все еще заполняется»? –

+1

Поскольку с точки зрения пользователя они должны иметь возможность завершить программу в любой момент времени. – gin

+0

, возможно, тогда ваш адаптер займет слишком много времени, чтобы заполнить. Рассмотрим загрузку меньшего набора данных. Возможно, используйте пейджинг .... –

ответ

7

Если процесс завершается, все операционные системы очищаются от всех собственных ресурсов (сетевых ручек, дескрипторов файлов и т. Д.). Я бы не стал ожидать заявление using, которое должно вступить в силу здесь - I подозреваемый ОС будет слишком сильно убивать потоки, чтобы получить возможность самостоятельно выполнить очистку. Это означает, что вы все равно закончите работу по очистке ... но любой покрас, который вы можете ожидать как часть инструкции using (например, в сценарии записи файлов), может не произойти.

+0

, если вышеуказанный код выполняется в потоке, вызывает ли вызов thread.abort() тот же результат? i.e операционная система вводит очистку собственного ресурса – gin

+1

@gin: Нет, я * верю * 'Thread.Abort' будет по-прежнему выполнять команды' finally' в стеке. (Heck, вы можете поймать 'ThreadAbortException' и сбросить его, если вы действительно этого захотите.) Отмена одного потока не позволяет ОС выполнять какую-либо очистку, потому что код ресурса будет использоваться в другом потоке. –

+1

Я просто провел несколько тестов из любопытства. 'Thread.Abort',' AppDomain.Unload' и 'Enviorment.FailFast' все заставляют блок finally быть запущенным (я был уверен, что' Thread.Abort' сделает это, но был довольно удивлен последними двумя). –

1

using заявления - это просто простые способы сделать try-finally блоки. Так что действительно вопрос в том, что вы вынудите выйти из программы, будет finally блоков, и ответ «нет».

Однако все внешние ручки (включая соединение с базой данных, которые вы открыли в примере кода) освобождаются, когда программа завершается, поэтому у вас не будет подключено соединение с сиротой, даже если блок finally никогда не запускался. Когда соединение прекращается, все транзакции, которые все еще открыты, будут откатны и отменены (даже если вы явно не запускаете транзакцию, все запросы заверяются в неявную транзакцию).

 Смежные вопросы

  • Нет связанных вопросов^_^