System.IO.IOException: «Процесс не может получить доступ к файлу» - PullRequest
0 голосов
/ 09 ноября 2018

Я пытаюсь синхронизировать запись в файл в проекте 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 Сообщение = Процесс не может получить доступ к файлу 'Log.txt' потому что он используется другим процессом. Источник = mscorlib

Что мне не хватает?

1 Ответ

0 голосов
/ 09 ноября 2018

Проблема в том, что ваше logginglock.lock является свойством с геттером, поэтому новый объект возвращается каждый раз, когда вы получаете к нему доступ. В результате потоки блокируют разные объекты и одновременно получают доступ к файлу.

Если вы настаиваете на наличии объекта блокировки в качестве поля статического объекта, то вы можете определить статическое поле, используя static let, а затем просто вернуть объект:

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

Тем не менее, это будет работать одинаково хорошо, если бы вы только что имели объект блокировки как глобальное значение в модуле (если он является частным для модуля). Скорее всего, это скомпилируется во что-то очень похожее на приведенный выше код - хотя существуют разные тонкости, связанные с блокировкой объектов и синглетонов, которые я никогда не понимал ...

let private loggingLock = obj()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...