System.IO.IOException:"进程无法访问文件"



我正在尝试将日志记录同步到F Sharp项目中的一个文件。使用锁计算表达式,我试图近似资源锁,但它似乎不起作用。

module regiondeployer.logger
open System
open System.IO
open Microsoft.FSharp.Core
open regiondeployer.personalprojectroot
type private logginglock =
static member public lock = new Object()
[<Literal>]
let private logfile = personalprojectroot + "log.txt" 
let public initialize() : unit = 
use init = File.Create(logfile)
()
let public logtoconsoleandfile (message:string) : unit =
lock logginglock.lock (fun _ -> 
Console.WriteLine message
use logfilestream = File.AppendText(logfile)
logfilestream.WriteLine(message)
)

System.IO.IOException HResult=0x8007020 Message=进程无法访问该文件'log.txt'因为它正被另一个进程使用。来源=mscorlib

我缺少什么?

问题是,您的logginglock.lock是一个带有getter的属性,因此每次访问它时都会返回一个新对象。因此,线程最终会锁定不同的对象,并实际同时访问该文件。

如果您坚持将锁对象作为静态对象的字段,那么您可以使用static let定义一个静态字段,然后只返回对象:

type private logginglock() =
static let _lock = new obj()
static member public lock = _lock

也就是说,如果您只是将锁对象作为模块中的全局值(只要它对模块是私有的(,它也会同样有效。这可能会编译成与上面的代码非常相似的东西——尽管在锁定对象和singleton方面有各种各样的微妙之处,我从来都不太理解。。。

let private loggingLock = obj()

最新更新