我有类似以下的情况:这种情况下推荐的F#模式是什么?
let mutable stopped = false
let runAsync() = async {
while not stopped do
let! item = fetchItemToProcessAsync
match item with
| Some job -> job |> runJobAsync |> Async.Start
| None -> do! Async.Sleep(1000)
}
let run() = Async.Start runAsync
let stop() =
stopped <- true
现在,当停止方法被调用时,我不得不停止阅读从DB进一步的项目,并等待当前开始到完成返回前的那些从这个功能。
完成此操作的最佳方法是什么?我想用一个计数器,(与联锁API)组成,当计数器达到0
如果没有做到这一点的另一种方式,我将不胜感激指导从停止方法返回。我有一种感觉,我可以在这里使用代理,但我不确定是否有任何可用的方法来与代理完成此操作,或者如果我仍然必须编写自定义逻辑以确定作业已完成执行。
感谢您的答复 - 我下去相同的路径了。不过,我有两个问题,看你的例子:1)当我们开始用'Async.StartChild异步:异步<'u>'然后不,我们需要有另一个呼叫“从异步<'u>检索'U(如让! x =孩子或者做!孩子)'? 2)鉴于这些工作可以在不同的时间完成,我们不需要为Map函数使用某种同步吗? –
嗨 - 是的,如果你想resutl你会净另一个让!为孩子 - 但我不关心答案(没有),你不必。第二:不,因为我从来没有访问过相同的地图,但总是生成新的地图(地图是不可变的)我不必考虑很多的协调性 - 除了那些只有当前继续/运行循环的线程才能访问它(这就是为什么我发布JobDone消息到处理器而不是更改全球地图/字典或其他) – Carsten
我建议你在那里放一些“printf”并且用代码来玩 - 总是帮助我在这些情况下(如果你运行testRun函数(你可以把它全部粘贴到F#交互中),你可以看到例如在任何任务完成之前调用quit,但函数只会在所有10个任务完成时返回) – Carsten