我有類似以下的情況:這種情況下推薦的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