小编Jak*_*zák的帖子

从异步方法访问logger对象时的死锁同步运行

下面的代码试图做一些工作,如果有错误则重试.还有一个错误回调,它调用一个将错误记录到控制台的函数.

执行时,错误仅记录到控制台一次,当程序暂停时,主线程被阻塞,retryErrorForever工作线程被阻塞log.

但为什么?

module Program

type MyLogger(loggerName: string) =
    member __.Warn fmt =
        Printf.kprintf (printfn "%s: %s" loggerName) fmt

let log = MyLogger("Logger")

let retryErrorForever errorCallback retryTimeout work =
    let rec loop () = async {
        let! result = work

        match result with
        | Error e ->
            errorCallback e
            do! Async.Sleep retryTimeout
            return! loop()
        | Ok x -> return Ok x
    }

    loop ()

let retryWorkUntilOk logError timeout (work: unit -> Result<string, string>) =
    let workflow …
Run Code Online (Sandbox Code Playgroud)

f# multithreading deadlock

4
推荐指数
1
解决办法
58
查看次数

使用System.IO.Compression.ZipArchive进行压缩不适用于F#代码

我试图使用以下脚本从F#中的字节数组创建一个zip文件.文件似乎是正确创建的,但是当我尝试打开它时出现错误.

当我试图解压缩来自zipFile函数的字节数组时,我得到了一个System.IO.InvalidDataException: End of Central Directory record could not be found.

我在zipFile功能上做错了吗?

#if INTERACTIVE
#r "System.IO.Compression.dll"
#endif

open System.IO
open System.IO.Compression
open System.Linq

let zipFile (fileName: string) (data: byte []) =
    try
        use ms = new MemoryStream()
        use archive = new ZipArchive(ms, ZipArchiveMode.Create)

        let entry = archive.CreateEntry(fileName)
        use entryStream = entry.Open()
        use bw = new BinaryWriter(entryStream)
        bw.Write(data)

        Ok (ms.ToArray())
    with e ->
        Error <| sprintf "Cannot zip stream %s: %s" fileName e.Message

let saveFile path …
Run Code Online (Sandbox Code Playgroud)

f#

4
推荐指数
1
解决办法
240
查看次数

标签 统计

f# ×2

deadlock ×1

multithreading ×1