下面的代码试图做一些工作,如果有错误则重试.还有一个错误回调,它调用一个将错误记录到控制台的函数.
执行时,错误仅记录到控制台一次,当程序暂停时,主线程被阻塞,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#中的字节数组创建一个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)