Response.Redirect ("") внутри "using {}" - PullRequest
3 голосов
/ 09 октября 2008

Примите следующий код:

using (SqlConnection conn = new SqlConnection(connectionString))
{
   ...
   using (SqlCommand comm = new SqlCommand(...))
   {
      .. do stuff ..
      if(condition) Response.Redirect("somepage.aspx");

   }
}

Будет ли выход Response.Redirect () из блоков using вызывать удаление всех соединений?

Или, альтернативно, есть ли способ выйти из блока использования, который не вызовет удаления?

РЕДАКТИРОВАТЬ: Я не хочу выходить без утилизации. Я хочу знать о любых подводных камнях, которые могли бы заставить его не работать. - Конечно, если не произойдет сбой, но я уверен, что все объекты находятся в сложном положении ... в этой ситуации

Я принял ответ, который, по сути, говорит: «Я не знаю», но это очень хорошо изученное «Я не знаю»

Между тем, я собираюсь предположить, что Response.Redirect прерывает оператор using и код с учетом этого. - Пока не доказано обратное.

Ответы [ 7 ]

4 голосов
/ 09 октября 2008

С http://msdn.microsoft.com/en-us/library/aa973248.aspx и http://msdn.microsoft.com/en-us/magazine/cc163298.aspx:

Calling Response.Redirect НЕ БУДЕТ выполнить блок finally ( и ключевые слова для конкретного языка, такие как C # оператор "using" ). Следовательно, перед любым перенаправлением или передачей обработка может произойти, вы должны утилизировать объектов.

Но с http://msdn.microsoft.com/en-us/library/system.threading.threadabortexception.aspx:

Когда выполняется звонок на прерывание способ уничтожить нить, общий язык выполнения бросает ThreadAbortException. ThreadAbortException - это особый исключение, которое можно поймать, но это будет автоматически поднят снова в конец блока ловли. Когда это Возникает исключение, время выполнения выполняет все блоки finally перед окончание потока. Так как поток может сделать неограниченное вычисление в наконец блокирует или звонит Тема .. ::. ResetAbort для отмены прервать, нет никакой гарантии, что нить когда-нибудь закончится. Если хотите ждать, пока прерванная нить закончено, вы можете позвонить Тема .. ::. Присоединиться к методу. Присоединиться это блокирующий вызов, который не возвращается пока поток фактически не остановится выполнения.

Похоже, что тест в порядке ...

2 голосов
/ 09 октября 2008

Response.Redirect прекращает выполнение на стороне сервера.

В обычном режиме выполнения выход из блока using вызывает удаление объекта. Могут возникнуть исключения из этого правила, например, когда процесс выключен, когда компьютер выключен, поток прерван и т. д. Но не в обычном режиме выполнения.

Посмотрите на Server.Transfer. Это может помочь вам в достижении ваших целей.

2 голосов
/ 09 октября 2008

В: Или, альтернативно, есть ли способ выйти из блока использования, который не вызовет утилизации?

A: Нет.

См. Это для получения дополнительной информации: C # «Использование» синтаксиса

1 голос
/ 09 октября 2008

С http://msdn.microsoft.com/en-us/library/aa973248.aspx

Calling Response.Redirect НЕ БУДЕТ выполнить блок finally. Следовательно, перед любым перенаправлением или передачей обработка может произойти, вы должны утилизировать объектов.

Да, он не имеет прямого отношения к оператору Using, но это достаточно распространенная практика программирования, о которой следует знать. Кроме того, эта статья относится к SharePoint, но поскольку SP построен на ASP.NET 2.0, я думаю, что он по-прежнему актуален.

0 голосов
/ 09 октября 2008

Что не так с:

использование (SqlCommand comm = new SqlCommand (...))
{
...
if (условие)
{

// Мы решили, что это правда, поэтому нам больше не нужно использовать
// Код утилизации

перерыв;
// или продолжить; если так будет лучше
}
// Код, который выполняется в случае «если» не соответствует действительности.
} * +1010 *

Response.Redirect (страница); "

0 голосов
/ 09 октября 2008

Почему вы хотите выйти из блока использования без утилизации? Это не идея использования блока.

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

0 голосов
/ 09 октября 2008

Все используемые операторы основаны на объеме. Поэтому независимо от того, как вы выходите из функции, каждый, кто был основан на этом стеке, очищается от использования. Исключения, возвраты и т. Д.

Я не знаю, как предотвратить выстрел, даже если вы по какой-то причине захотели.

...