程序强制关闭时“使用”阻止释放资源

时间:2015-09-29 05:49:39

标签: c# dispose idisposable using-statement

按标题提问。

我有一段代码可以做到这一点:

    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仍在填充数据集时强行退出程序时,程序冻结并停止响应。

我知道“使用”块会在资源超出范围时释放资源,但在强制终止的情况下,资源是否会优雅地释放?

2 个答案:

答案 0 :(得分:7)

如果进程退出,则操作系统会清除所有本机资源(网络句柄,文件句柄等)。我不会期望 using语句在这里生效 - 我怀疑操作系统会杀死线程太难以让它有机会做清理本身。这意味着你仍然会完成清理......但是你可能期望在using语句中发生的任何冲洗(例如在文件编写方案中)可能不会发生。

答案 1 :(得分:1)

using语句只是执行try-finally块的简单方法。所以真正的问题是,如果你强制退出程序,finally阻止运行,答案是“否”。

但是,程序终止时会释放所有外部句柄(包括您在代码示例中打开的数据库连接),因此即使finally块从未运行,也不会有孤立的数据库连接。当连接终止时,任何仍处于打开状态的事务都将回滚并撤消(即使您没有显式启动事务,所有请求都会包含在隐式事务中)。