在使用块内调用 Response.Redirect() 方法是否会调用 Dispose() 方法?

3

可能是重复问题:
在“using { }”内部使用Response.Redirect("")

就是这样。如果我在 using 语句中有一个连接到数据库,并且在该语句的某个地方重定向到另一个页面,它会释放我的连接吗?还是我必须先手动调用它?


3
参见:https://dev59.com/j0XRa4cB1Zd3GeqPr3Vu?rq=1 - user180326
4个回答

7
是的,它绝对会调用Dispose。使用using语句的目的是在finally块中调用Dispose,因此无论块是正常完成还是异常完成,资源都将被处理。
这里有一个微小的问题,即如果我没记错,Response.Redirect会抛出ThreadAbortException,如果它被捕获,它会自动重新抛出,但这不应该影响finally块。

1
链接问题中@JasonZ的注释怎么说:调用Response.Redirect将不会执行finally块。 - mellamokb
@mellamokb:对我来说,那听起来不正确。查看链接的MSDN页面,它不再包含被引用的文本。有一个相当长的部分,但它绝对没有说它“不会执行finally块”。 - Jon Skeet
是的,我也注意到了。多个答案引用了这段文字,但是当我在谷歌上搜索时,在MSDN上没有任何关于这段文字的参考资料。它一定曾经存在过并且已经被更改了吗? 编辑:确实有一段时间存在这样的引用:http://web.archive.org/web/20080515002933/http://msdn.microsoft.com/en-us/library/aa973248.aspx。非常奇怪...自2008年以来是否发生了什么变化? - mellamokb
从http://msdn.microsoft.com/en-us/library/system.threading.threadabortexception.aspx, "当引发此异常时,运行时将在结束线程之前执行所有finally块。由于线程可以在finally块中进行无限计算或调用Thread.ResetAbort来取消中止,因此不能保证线程将永远结束。" - Roger
@Roger:没错。基本上应该没问题。 - Jon Skeet

2

它将正确处理连接。 using 只是 try/finally 的语法糖。如果你想确认行为,请用 try/finally 替换 using。在执行重定向之前,它将跳转到 finally


0

它将为您处理连接的释放。


0

有几种情况下,Dispose() 方法不会被调用:

应用程序进入无限循环且永远不会返回。 应用程序非正常关闭。 using 在迭代器中,并且尚未实际进入 using

你知道前两种情况都不是,因为你的进程既没有挂起也没有崩溃。 你知道第三种情况是因为重定向在 using 内部,所以不可能是这种情况。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接