"using"程序强制关闭时是否阻塞释放资源
Does "using" block release resource when program force closed
按标题提问。
我有一段代码可以做到这一点:
using (SqlConnection dbcon = new SqlConnection(connectionString))
using (SqlDataAdapter dataAdapter = new SqlDataAdapter(statement, dbcon))
{
dat_set = new System.Data.DataSet();
dbcon.Open();
dataAdapter.Fill(dat_set, name);
}
当我在dataAdapter仍在填充数据集时强制退出程序时,程序冻结并停止响应。
我知道"using"当资源超出范围时会阻止释放资源,但是在强制终止的情况下,资源是否会正常释放?
如果进程退出,所有本机资源(网络句柄、文件句柄等)都会被操作系统清除。我不会 期望 using
声明在这里生效 - 我 怀疑 OS 会终止线程太难了,它没有机会自己进行清理。这意味着您最终仍会完成清理工作......但是您可能希望作为 using
语句的一部分发生的任何刷新(例如,在文件写入场景中)可能不会发生。
using
语句只是执行 try-finally
块的简单方法。所以真正的问题是如果你强制退出一个程序会 finally
阻塞 运行,答案是 "no".
但是,当程序终止时,所有外部句柄(包括您在代码示例中打开的数据库连接)都会被释放,因此您不会有孤立的数据库连接,即使 finally 块从来没有 运行 .当连接终止时,任何仍处于打开状态的事务都将回滚并撤消(即使您没有明确启动事务,所有请求都包含在隐式事务中)。
按标题提问。
我有一段代码可以做到这一点:
using (SqlConnection dbcon = new SqlConnection(connectionString))
using (SqlDataAdapter dataAdapter = new SqlDataAdapter(statement, dbcon))
{
dat_set = new System.Data.DataSet();
dbcon.Open();
dataAdapter.Fill(dat_set, name);
}
当我在dataAdapter仍在填充数据集时强制退出程序时,程序冻结并停止响应。
我知道"using"当资源超出范围时会阻止释放资源,但是在强制终止的情况下,资源是否会正常释放?
如果进程退出,所有本机资源(网络句柄、文件句柄等)都会被操作系统清除。我不会 期望 using
声明在这里生效 - 我 怀疑 OS 会终止线程太难了,它没有机会自己进行清理。这意味着您最终仍会完成清理工作......但是您可能希望作为 using
语句的一部分发生的任何刷新(例如,在文件写入场景中)可能不会发生。
using
语句只是执行 try-finally
块的简单方法。所以真正的问题是如果你强制退出一个程序会 finally
阻塞 运行,答案是 "no".
但是,当程序终止时,所有外部句柄(包括您在代码示例中打开的数据库连接)都会被释放,因此您不会有孤立的数据库连接,即使 finally 块从来没有 运行 .当连接终止时,任何仍处于打开状态的事务都将回滚并撤消(即使您没有明确启动事务,所有请求都包含在隐式事务中)。