微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

F#中的计算是否在完成时调用Dispose?

如何解决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 举报,一经查实,本站将立刻删除。