1

Tomas の BlockingQueueAgent を使用して、F# コンソール プログラムを作成しました。

https://github.com/tpetricek/FSharp.AsyncExtensions/blob/master/src/Agents/BlockingQueueAgent.fs

次のコードがあります。しかし、プログラムは決して終わりません。コンシューマーでループを終了する方法は?

let producer() = 
    let addLinks = async {
        for url in links do
            do! ag.AsyncAdd(Some (url))
            printfn "Producing %s" url }
    async { do! addLinks
            do! ag.AsyncAdd(None) }

let consumer() = async {
    while true do 
        let! item = ag.AsyncGet()
        match item with 
        | Some (url) ->
            printfn "Consuming  %s" url
            ....
        | None -> 
            printfn "Done" } // How to exit the loop from here?

producer() |> Async.Start
consumer() |> Async.RunSynchronously
4

1 に答える 1

4

ildjarn が示唆するように、ループの代わりに再帰を使用します。

let rec consumer() = async {
    let! item = ag.AsyncGet()
    match item with
    | Some(url) ->
        printfn "Consuming %s" url
        ...
        return! consumer() // recursive call only in this case
    | None -> 
        printfn "Done" }
于 2013-10-28T21:18:09.883 に答える