4

假设以下代码:

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

   }
}

Response.Redirect() 从 using 块中退出会导致它处理所有连接吗?

或者,是否有任何方法可以退出不会导致处置的 using 块?

编辑:我不想在没有处置的情况下退出。我想知道任何会导致它不起作用的陷阱。- 当然,除非崩溃,但我很确定所有对象都已处理 - 艰难的方式 - 在那种情况下

我接受了一个答案,基本上说“我不知道”,但这是一个经过充分研究的“我不知道”

同时,我将假设 Response.Redirect 中止 using 语句和代码。-- 除非另有证明。

4

7 回答 7

6

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

调用 Response.Redirect 不会执行 finally 块以及特定于语言的关键字,如 C#“使用”语句)。因此,在任何重定向或处理转移发生之前,您必须处置对象。

但来自http://msdn.microsoft.com/en-us/library/system.threading.threadabortexception.aspx

当调用 Abort 方法来销毁线程时,公共语言运行时会引发 ThreadAbortException。ThreadAbortException 是一个可以被捕获的特殊异常,但它会在 catch 块结束时再次自动引发。当引发此异常时,运行时会在结束线程之前执行所有 finally 块。由于线程可以在 finally 块中进行无限计算,或者调用 Thread..::.ResetAbort 来取消中止,因此无法保证线程将永远结束。如果要等到中止的线程结束,可以调用 Thread..::.Join 方法。Join 是一个阻塞调用,直到线程真正停止执行才返回。

看来要考试了。。。

于 2008-10-09T13:42:16.637 回答
2

问:或者,有什么方法可以退出不会导致处置的 using 块?

答:没有。

有关更多信息,请参见:C#“使用”语法

于 2008-10-09T13:14:27.020 回答
2

Response.Redirect 终止服务器端执行。

在正常的执行过程中,退出 using-block 会触发对象处理。此规则的例外情况可能会发生,例如当进程关闭时、计算机关闭时、线程中止时等。但在正常执行过程中不会发生。

查看 Server.Transfer。它可以帮助您实现目标。

于 2008-10-09T13:18:24.827 回答
2

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

调用 Response.Redirect 不会执行 finally 块。因此,在任何重定向或处理转移发生之前,您必须处置对象。

是的,它不直接处理 Using 语句,但它是一种足够常见的编程实践,需要注意。另外,那篇文章提到了 SharePoint,但由于 SP 是基于 ASP.NET 2.0 构建的,我认为它仍然是相关的。

于 2008-10-09T13:29:43.260 回答
0

所有 using 语句都是基于范围的。因此,无论您如何退出该函数,当时基于堆栈的每个人都将从使用中清除。例外、退货等

我不知道有什么方法可以阻止一个人开火,即使你出于某种原因想要这样做。

于 2008-10-09T13:17:35.283 回答
0

为什么要在没有处置的情况下退出 using 块?这不是 using 块的想法。

如果您愿意,请不要使用它,但我不推荐它。

于 2008-10-09T13:18:25.187 回答
0

有什么问题:

using(SqlCommand comm = new SqlCommand(...))
{
...
if(condition)
{

//我们已经确定这是真的,所以我们不再需要使用
//Disposal Code

休息;
//或继续;if that's better
}
//在“if”不成立的情况下执行的代码。
}

响应.重定向(页面);”

?

于 2008-10-09T13:25:56.233 回答