如何解决F#中的计算是否在完成时调用Dispose?
我在查询中与数据库连接类似,在项目中的几个单独文件中如下所示:
sqlTypes.fs
module sqlTypes
open fsharp.data.typeproviders
type DBType = sqlDataConnection<ConnectionStrings.DbConnStr>
let getDb() = DBType.GetDataContext() //will this cause a memory leak when called from outside here?
Utilities.fs
module Utilities
open System
open sqlTypes
open System.Linq
///Returns an IQueryable of Orders whose OrderStatus is less than 5 (Not yet released)
let private getordersNotYetReleased () =
let orders = query {
for order in getDb().Orders do //memleak here?
where(order.Status < 5)
sortBy (order.CreatedDateUtc)
select order
}
//return
orders
问:是否有必要使用use
子句(如下所示)以防止内存泄漏?
///Returns an IQueryable of Orders whose OrderStatus is less than 5 (Not yet released)
let private getordersNotYetReleased () =
use db = DBType.GetDataContext() //is this safer? Does it matter if this `use` is here?
let orders = query {
for order in db.Orders do
where(order.Status < 5)
sortBy (order.CreatedDateUtc)
select order
}
//return
orders
或者,当计算块退出时,将在Db对象上调用dispose()
吗?
解决方法
IDisposable
模式提供了一种Dispose()
方法。 use
关键字可以利用这种模式;如果某个类实现了IDisposable
,则该类的作者告诉您,在其类中使用use
关键字可能是一个好主意。
Dispose()
方法的实际作用完全取决于类的作者为Dispose()
方法编写的代码。无法保证它甚至可以做任何事情。
Microsoft在IDisposable
上的官方说法一直是,其目的是“清理不受管理的资源”,但实际上,Dispose()
所做的一切是该类作者认为应该做的一切关闭对象。通常,不所做的是从托管对象中恢复内存。这就是垃圾收集器的目的。
但是,一般来说,如果一个类实现IDisposable
,则意味着它包含一个Dispose()
方法,该方法对对象的配置有重要意义,例如关闭文件或数据库连接。所以。类实现IDisposable
?配合使用use
。
进一步阅读
Managing Resources in F#
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。