Ответ.Перенаправить(“”) внутрь “используя{ }”

StackOverflow https://stackoverflow.com/questions/187189

  •  06-07-2019
  •  | 
  •  

Вопрос

Предположим, что используется следующий код:

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

   }
}

Приведет ли выход Response.Redirect() из блоков using к удалению всех подключений?

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

Редактировать:Я не хочу уходить, не избавившись от него.Я хочу быть в курсе любых подводных камней, которые могли бы привести к тому, что это не сработает.-- За исключением сбоев, конечно, но тогда я почти уверен, что все объекты будут удалены - трудным способом - в этой ситуации

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

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

Это было полезно?

Решение

От http://msdn.microsoft.com/en-us/ библиотека / aa973248.aspx

  

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

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

Другие советы

От http://msdn.microsoft.com/en-us/ library / aa973248.aspx и http://msdn.microsoft. ком / ан-нас / журнал / cc163298.aspx :

  

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

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

  

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

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

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

A: нет.

Дополнительную информацию смотрите здесь: C # " Использование " Синтаксис

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

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

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

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

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

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

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

Что плохого в:

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

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

перерыв;
//или продолжить;если так будет лучше
}
//Код, который выполняется в случае, если значение "if" неверно.
}

Ответ.Перенаправление (страница);"

?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top