为什么我的mailBoxProcessor卡在receive方法中?

时间:2014-06-03 14:16:02

标签: f# mailboxprocessor

我正在使用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

0 个答案:

没有答案