2

我正在使用 F# mailBoxProcessor 异步处理从多个网络端接收到的消息。

代码按预期工作,直到我在 inbox.receive() 之后添加函数调用 getTreasuryYield。

运行几秒钟后,它每次都会卡在 inbox.receive() 处。

GetTreasuryYield 是一个相当慢的方法,因为它涉及数据库和 IO 操作,但我

仍然不明白它是如何卡住的。

任何帮助将不胜感激。

let start rvSetting (agent:Agent<Message>) messageSelector=
    try
        TIBCO.Rendezvous.Environment.Open()
        let _transport = new NetTransport(rvSetting.rvService, rvSetting.rvNetwork, rvSetting.rvDaemon)
        let _listener = new Listener(TIBCO.Rendezvous.Queue.Default, _transport, rvSetting.rvSubject, null)
        _listener.MessageReceived.Add(fun args->
            printfn "before sent"
            if messageSelector(args.Message) then 
                printfn "Message sent to agent: %A" args.Message
                agent.Post(args.Message))
        let rec dispatch() =
            async{
                try
                   TIBCO.Rendezvous.Queue.Default.Dispatch()
                    return! dispatch()
                with
                    | e -> _log.Error(e.ToString())   
           }
        Async.Start(dispatch())
    with
        |e -> printfn "%A" e.Message
              _log.Error(e.Message)
 let agent = new Agent<Message>(fun inbox ->
    let rec loop() =
        async{
            let! (m : Message) = inbox.Receive()
            // This line causes the problem
            printfn "%A" (getTreasuryYieldFromMessage m)
            Async.Start(treasuryAction m)
            return! loop()    
        }  
    loop())
agent.Error.Add raise
[<EntryPoint>]
let main argv =
    //start rvCorporate agent (fun x -> true)
    agent.Start()
start rvTreasury agent treasurySelector
    Console.ReadLine() |> ignore
    0
4

0 回答 0