Pergunta

Suponha o seguinte código:

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

   }
}

Será que o Response.Redirect () saída das usando blocos porque é de se desfazer todas as conexões?

Ou, alternativamente, existe alguma maneira de sair de um bloco usando que não irá causar disposição?

EDIT: Eu não quero sair sem disposição. Quero estar ciente de quaisquer armadilhas que poderiam causar que ele não funcione. - Restrição de acidentes, é claro, mas então eu tenho certeza que todos os objetos estão dispostos --o way-- difícil nessa situação

Eu aceitei uma resposta, que essencialmente diz "Eu não sei", mas é um muito bem pesquisado "Eu não sei"

Por meio tempo, eu vou assumir que Response.Redirect aborta a instrução usando e código com isso em mente. -. Até prova em contrário

Foi útil?

Solução

A partir http://msdn.microsoft.com/en-us/ biblioteca / aa973248.aspx

Chamando Response.Redirect não vai executar o último bloco. Portanto, antes de qualquer redirecionamento ou transferência de processamento pode ocorrer, você deve descartar dos objetos.

Sim, ele não aborda diretamente a instrução usando, mas é uma prática de programação bastante comum para estar ciente. Além disso, o referido artigo refere-se ao SharePoint, mas como SP é construído em ASP.NET 2.0, eu acho que ainda é relevante.

Outras dicas

A partir http://msdn.microsoft.com/en-us/ biblioteca / aa973248.aspx e http://msdn.microsoft. com / en-us / revista / cc163298.aspx :

Chamando Response.Redirect não vai executar o bloco finally ( e palavras-chave específicas de língua como o C # "Using" ). Portanto, antes de qualquer redirecionamento ou transferência de processamento pode ocorrer, você deve descartar dos objetos.

Mas a partir http://msdn.microsoft.com /en-us/library/system.threading.threadabortexception.aspx :

Quando uma chamada é feita para o Abort método para destruir um segmento, o comum language runtime lança um ThreadAbortException. ThreadAbortException é uma especial exceção que pode ser capturado, mas será automaticamente levantada novamente no o fim do bloco de captura. Quando esta excepção é aumentada, o tempo de execução executa todos os blocos finally antes terminando o segmento. Desde o fio pode fazer um cálculo ilimitada na finalmente, blocos, ou chamada Passe .. ::. ResetAbort para cancelar a abort, não há garantia de que o rosca nunca vai acabar. Se você quiser esperar até que o fio abortado tem terminou, você pode chamar o Passe .. ::. Método Join. Junte-se a bloqueio de chamadas que não retorna até que o segmento realmente pára execução.

soa como um teste está em ordem ...

Q:? Ou, alternativamente, existe alguma maneira de sair de um bloco usando que não irá causar disposição

A: Não.

Veja este para mais informações: C # "Usar" Sintaxe

Response.Redirect termina a execução do lado do servidor.

No curso normal de execução, sair de um usando-block disposição gatilhos objeto. As excepções a esta regra podem ocorrer, por exemplo, quando o processo for encerrado, quando o computador é desligado, quando um fio é abortada, etc. Mas não no curso normal de execução.

Olhe em Server.Transfer. Pode ajudá-lo a realizar seus objetivos.

Todas as declarações usando estão escopo baseado. Portanto, não importa como você sair da função de todos que a pilha foi baseado nesse ponto é limpo a partir do usando. Exceções, retornos, etc.

Eu não sei de nenhuma maneira de impedir alguém de disparo, mesmo que você queria por algum motivo.

Por que você gostaria de sair de um bloco usando sem a disposição? Essa não é a ideia do bloco usando.

Não usá-lo se você gosta, mas eu não recomendo.

O que há de errado com:

usando (SqlCommand comm = new SqlCommand (...))
{
...
if (condição)
{

// Nós decidimos isso é verdade para que não precisam da utilização de mais qualquer
// Eliminação Código

break;
// ou continuar; se isso é melhor
}
// código que executa no caso de "se" não é verdade.
}

Response.Redirect (página); "

?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top