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

时间:2018-11-08 23:07:58

标签: .net multithreading f# locking

我正在尝试将日志记录同步到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 = 0x80070020 Message =进程   无法访问文件   'log.txt'   因为它正在被另一个进程使用。来源= mscorlib

我想念什么?

1 个答案:

答案 0 :(得分:7)

问题在于您的logginglock.lock是带有吸气剂的属性,因此每次访问它都会返回一个新对象。结果,线程最终将锁定不同的对象,并实际上同时访问文件。

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

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

也就是说,如果您只是将锁对象作为模块中的全局值(只要它是该模块的私有属性),它将同样有效。这可能会编译成与上面的代码非常相似的东西-尽管围绕锁定对象和单例的各种微妙之处我从未完全了解...

let private loggingLock = obj()