假设以下代码:
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语句和代码。 - 除非另有证明。
答案 0 :(得分:4)
来自http://msdn.microsoft.com/en-us/library/aa973248.aspx和http://msdn.microsoft.com/en-us/magazine/cc163298.aspx:
调用Response.Redirect不会 执行finally块(和 特定于语言的关键字,如C# “使用”声明)。因此, 在任何重定向或转移之前 处理可以发生,你必须处置 对象。
但是来自http://msdn.microsoft.com/en-us/library/system.threading.threadabortexception.aspx:
拨打中止电话时 破坏线程的方法,常见的 语言运行时抛出一个 ThreadAbortException。 ThreadAbortException是一个特殊的 可以捕获的异常,但它 将自动再次提升 捕获块结束。 当这个 引发异常,运行时 之前执行所有finally块 结束线程。自线程以来 可以做一个无限的计算 最后阻止,或打电话 Thread .. ::。ResetAbort取消 中止,不能保证 线程将永远结束。如果你想 等到中止的线程有 结束了,你可以打电话给 Thread .. ::。Join方法。加入是一个 阻止不返回的呼叫 直到线程实际停止 执行。
听起来像是测试......
答案 1 :(得分:2)
答案 2 :(得分:2)
Response.Redirect终止服务器端执行。
在正常执行过程中,退出使用块会触发对象处理。例如,可能会出现此规则的例外情况。当进程关闭,计算机关闭,线程中止等等时,但不是正常的执行过程。
查看Server.Transfer。它可以帮助您实现目标。
答案 3 :(得分:1)
来自http://msdn.microsoft.com/en-us/library/aa973248.aspx
调用Response.Redirect不会 执行finally块。因此, 在任何重定向或转移之前 处理可以发生,你必须处置 对象。
是的,它没有直接解决Using语句,但它是一个常见的编程实践,需要注意。此外,该文章指的是SharePoint,但由于SP是基于ASP.NET 2.0构建的,我认为它仍然具有相关性。
答案 4 :(得分:0)
所有使用语句都是基于范围的。因此,无论您如何退出该功能,每个基于该点的堆栈都将从使用中清除。例外,退货等。
即使你出于某种原因,我也不知道有什么方法可以阻止你开枪。
答案 5 :(得分:0)
为什么要在没有处置的情况下退出使用区块?这不是使用块的想法。
如果你愿意,不要使用它,但我不推荐它。
答案 6 :(得分:0)
出了什么问题:
使用(SqlCommand comm = new SqlCommand(...))
{
...
如果(条件)
{//我们已经确定这是真的,所以我们不再需要使用了 //处置代码
中断;
//或继续;如果那更好的话 }
//在“if”不是真的情况下执行的代码 }的Response.Redirect(页);“