【发布时间】:2019-12-03 00:24:09
【问题描述】:
我有一个可观察的序列需要映射到 一个 C# 任务。这些 C# 任务不应该同时运行,而是一个在之后 其他。基本上,我需要实现这个 C# 的 F# 等价物 问题:
天真地翻译这段 C# 代码会得到如下内容:
let run (idx:int) (delay:int) =
async {
sprintf "start: %i (%i)" idx delay |> System.Diagnostics.Trace.WriteLine
let! t = System.Threading.Tasks.Task.Delay(delay) |> Async.AwaitTask
sprintf "finish: %i" idx |> System.Diagnostics.Trace.WriteLine
t
}
Observable.generate (new Random()) (fun _ -> true) id (fun s -> s.Next(250, 500))
|> Observable.take 20
|> Observable.mapi(fun idx delay -> idx, delay)
|> Observable.bind(fun (idx, delay) -> Observable.ofAsync (run idx delay))
|> Observable.subscribe ignore
|> ignore
这没有按预期工作,因为我不会在任何地方等待结果。有没有 一种在 F# 中执行此操作而不阻塞线程的方法,就像 C# 的 await 一样?
【问题讨论】:
标签: f# async-await system.reactive